JAVA-객체 지향 프로그래밍(OOP)
2023. 1. 25. 15:44ㆍ코딩일기/JAVA
- class : 객체의 종류
- 객체 : 고유의 기능과 값을 가진 녀석(변수 + 함수)
Java System Library에 2000여개의 클래스가 있다.
클래스를 가지고 객체를 생성하는 것이 객체 지향 프로그래밍!
이것을 다 외워서 쓴다는건 무리. 사용자가 직접 만들어 쓰는 사용자 정의 class 가 있다.
- 사용자 정의 class
custom 객체!
class를 만드는 방법 - 4가지 위치.
1) 별도의 .java 문서에 만들기
2) 하나의 .java 문서안에 여러개의 class를 설계하기
3) class안에 또 다른 class 설계하기
4) 함수(메소드)안에 class를 설계하기
// 사용자 정의 클래스
public class Second {
// 클래스는 멤버변수(필드)와 멤버함수(메소드)로 구성
// 멤버변수(필드)
int a;
// 멤버함수(메소드)
void aaa() {
System.out.println("Second aaa method");
// 함수안에 다른 class 설계
// 지역 class 라고 부름 ===================
class Nice {
int a;
void show(){
System.out.println("Nice show method");
}
}//=====================
}//aaa method
// 다른 클래스 설계하기 //////////////////////////
//inner class 라고 부름
class Hello{
int a;
void show() {
System.out.println("Hello show method");
}
}////////////////////////////////
}//Second class
// 또 다른 class를 선언할 수 있음.
class Third {
int a;
void show() {
System.out.println("Third show method");
}
}
public class Main {
public static void main(String[] args) {
// 객체지향프로그래밍(OOP) - 객체 위주로 프로그래밍을 한다.
// 객체 : 고유한 기능과 값을 가진 녀석(변수 + 함수)
// class : 객체의 종류
// OOP는 이런 객체들을 필요할 때 만들어서 기능을 사용하여 프로그래밍 하는 방식
// 자바에서는 자주 사용될 기능들을 이미 만들어 설계해 놓았다.
// 이런 설계도 파일들을 class 라고 부른며..2000여개 정도 존재함.
// 이런 class들을 Java System Library API 라고 부름.
// 아무리 2000여개의 클래스가 있더라도 내가 원하는 모든 기능이 모두
// 있을 수는 없음. 그래서 개발자가 기능을 만들어야 하는 경우도 있음.
// 이를 사용자 정의 클래스 라고 부른다.
// class를 만드는 방법 - 4가지 위치.
// 1) 별도의 .java 문서에 만들기
// 2) 하나의 .java 문서안에 여러개의 class를 설계하기
// 3) class안에 또 다른 class 설계하기
// 4) 함수(메소드)안에 class를 설계하기
// 개발자가 정의한 class를 이용하여 객체 생성
Second s = new Second();
s.a = 10; // 멤버변수 사용
s.aaa(); // 멤버함수 사용
Third t = new Third();
t.a = 100;
t.show();
//Second클래스 안에 설계한 Hello inner 클래스
//Hello h = new Hello(); // 못알아들음
//Second.Hello h = new Second.Hello(); //이너클래스는 객체 생성 불가
}
}
Package 사용 방법!
// bbb 패키지안에 있는 Student클래스를 편하게 사용하도록 미리 불러오기
import java.util.*; //java.util 안에 있는 모든 클래스
import bbb.Student;
public class Main {
public static void main(String[] args) {
// 기본적인 class를 설계하고 객체를 생성하여 사용하는 모습
Test t = new Test();
t.a = 10; // 멤버변수 사용
t.show(); // 멤버함수 호출
// 같은 이름의 class를 사용하게 되는 문제가 발생할 수도 있음.
// 이때 사용하는 것이 package 라는 개념임.
// 물리적인 폴더구분을 통해 같은 이름의 class를 구별
// 사용자정의 클래스로 Student 객체를 생성해보기
// 즉, 학생의 정보[이름, 나이, 주소]를 가진 클래스
aaa.Student stu = new aaa.Student();
stu.name = "sam";
// stu.age = 20; //error (public 필요!)
// 또 다른 학생에 대한 정보가 필요할 수 있음.
// [이름, 국어, 영어] 데이터를 가진 클래스
// 이 때도 Student 라는 이름이 적합해 보임.
bbb.Student stu2 = new bbb.Student();
stu2.name = "robin";
stu2.kor = 80;
stu2.eng = 90;
// bbb패키지의 Student클래스 객체가 또 필요하다면?
// 패키지명을 매번 작성하는 것이 귀찮음
// 그래서 이 .java문서 안에서는 bbb. 패키지를 마음대로 인식할 수 있도록
// 미리 클래스를 가져오기 - import
Student stu3 = new Student();
Student stu4 = new Student();
// 2000여개의 Java System API 클래스들은 모두 패키지가 있음.
java.util.Random rnd = new java.util.Random();
// 즉, Random 클래스 앞에 쓰는 java.util. 이 패키지명 이었던 것임.
// java.util 패키지명 쓰는 것이 번거로워서 import 했던것임.
Random rnd2 = new Random();
java.util.Scanner scan = new java.util.Scanner(System.in);
// 패키지 중에서 특별한 패키지 하나가 존재함.
// String, System .. 이런 클래스들이 있는 java.lang 패키지
// 원래는 패키지명을 같이 써야 하기에 아래처럼 써야 하지만
java.lang.String s = new java.lang.String("Hello");
// java.lang은 워낙 기본적인 클래스들만 있어서 자바언어에서 자동 import 함
String s2 = new String("Nice"); // 자동 import
aaa.Person p = new aaa.Person();
// Java System API 클래스들의 패키지명이 모두
// xxx.xxx 라는 식으로 두 단어 이상으로 구성됨
// 패키지명을 가급적 유의미한 단어(마치 카테고리 같은)를 사용하고
// 두 단어 이상으로 사용하기를 권장함.
// 보통은 클래스를 만든 회사명의 도메인을 역으로 작성함
// 예) 지도 클래스 Map 클래스
// 이를 만드는 회사가 3개 Google Naver Kakao
// com.google.Map
// com.naver.Map
// com.kakao.Map
// kr.or.mrhi.android.Map
// 이 때 패키지명은 반드시 소문자로만 작성할 것을 강제로 권장함.
// 여러 단어를 구분할 때 사용하는 . 은 하위폴더를 의미함
mrhi.dev.First f = new mrhi.dev.First();
mrhi.dev.android.Second ss = new mrhi.dev.android.Second();
}
}
package aaa;
// [이름, 나이, 주소] 데이터를 저장하는 학생정보 클래스
public class Student {
public String name; // 다른 패키지에서도 멤버를 사용하게 하려면 public
int age;
String address;
// 같은 패키지의 다른 클래스는 그냥 사용
Person p = new Person();
}
package aaa;
public class Person {
public String name;
public int age;
}
package bbb;
import aaa.*;
// [이름, 국어, 영어] 데이터를 가진 클래스
public class Student {
public String name;
public int kor;
public int eng;
Person p;
// default 패키지에 있는 Test 클래스 사용해보기
// default 패키지는 패키지명이 없기에 다른 패키지에서는 사용 불가능
///???.Test t;
}
접근 제한자 Access Modifier
import aaa.Second;
public class Main {
public static void main(String[] args) {
// OOP는 객체의 멤버들을 외부에서 마음대로 사용하는 것에 대해 제한
// 그래서 존재하는 접근제한자 라는 문법이 존재함.
// 멤버접근을 제한하는 제한자의 4가지 종류 [보안 강 --> 약]
// 1. private : 본인 클래스 안에서만 접근이 가능한 제한자
// 2. default : 같은 패키지 안에서는 . 연산자로 멤버접근이 가능, 다른 패키지에서는 접근 불가
// 3. protected : 같은 패키지 안에서는 . 연산자로 멤버접근이 가능, 다른 패키지에서는 접근 불가, 단, 상속관계라면 접근 가능함
// 4. public : 어디서든 . 연산자만 있으면 접근 가능
// 같은 패키지의 클래스 객체 생성
First f = new First();
// 다른 패키지의 클래스 객체 생성
Second s = new Second();
s.d = 40;
// 멤버함수 호출 - 함수도 멤버에 대한 접근제한영향 받음
// s.show() // error
s.output();
}
}
public class First {
// 4가지 유형의 접근제한자가 적용된 멤버변수들
private int a;
int b; // 아무 명시가 없을때 default
protected int c;
public int d;
// 멤버함수
void aaa() {
// 같은 클래스안에 있는 멤버변수들은 접근제한자와 상관없이 그냥 사용
a = 30;
b = 20;
c = 10;
d = 40;
}
}
package aaa;
public class Second {
// 접근제한자가 부여된 4개의 멤버변수
private int a;
int b;
protected int c;
public int d;
// defalut 접근제한 멤버함수
void show() {
a = 100;
b = 200;
c = 300;
d = 400;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
// public 접근제한
public void output() {
System.out.println("public 메소드");
}
}
private 으로 선언된 int a 는
같은 패키지 안에 있지만 다른 클래스에 있는 Main 에서 볼 수 없다.
다른 패키지의 Second 클래스에 있는 public으로 선언한 d 외에는
다른 접근제한자가 부여된 멤버변수는 참조할 수 없다
GitHub - jake5113/Mrhi_JAVA
Contribute to jake5113/Mrhi_JAVA development by creating an account on GitHub.
github.com
반응형
'코딩일기 > JAVA' 카테고리의 다른 글
Java - 생성자 Constructor (0) | 2023.01.26 |
---|---|
JAVA- 메소드 오버로딩 method overloading (0) | 2023.01.25 |
Java-Method (0) | 2023.01.25 |
JAVA-Array 연습 문제 풀기 (0) | 2023.01.25 |
JAVA-Array (참조형 배열) (0) | 2023.01.20 |