2021. 11. 18. 18:17ㆍLanguage`/Java
클래스-객체
클래스
- 객체를 만들기 위한 설계도/틀
- 객체의 속성/행동 포함
객체
- 클래스(캡슐)의 모양 그대로 찍어낸 실체
- 프로그램 실행 중에 생성되는 객체
- 메모리 공간을 갖는 구체적인 실체
- 인스턴스(Instance)라고도 불림
- 클래스 : 객체 = 1 : M
※ Example
- 클래스 : 사람 / 객체 : 홍길동, 가나다,...
- 클래스 : 자동차 / 객체 : BMW, 페라리,...
클래스 구성
≫ 클래스 선언 (class Circle)
- 중괄호{} 안에 필드(field), 메소드(method)를 모두 작성
- 클래스 외부에는 어떤 필드나 메소드도 올 수 없다 (캡슐화의 원칙)
≫ 필드/메소드
- 필드 : 변수 (radius, name)
- 메소드 : 함수 (Circle(), getArea())
객체 생성
1. 객체에 대한 레퍼런스 변수 선언
- 아직 Circle 타입의 객체 생성 X -> 레퍼런스 변수만 생성 + null로 초기화
- 객체에 대한 주소만 존재
Circle pizza; // Circle 객체에 대한 레퍼런스 변수 pizza 선언
2. 객체 생성
- 클래스 타입 크기의 메모리 할당
- 객체 내 생성자 코드 실행
pizza = new Circle(); // Circle 객체 생성
3. 객체의 멤버 접근
// 객체 레퍼런스.멤버
pizza.radius = 10;
pizza.name = "자바피자";
생성자 (Constructor)
- 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드
- 객체가 생성되는 순간에 자동으로 호출되는 메소드
- 필드 초기화/필요한 메모리 확보/파일 열기/네트워크 연결 등 객체가 활동하기 전에 필요한 초기 준비하는데 이용
≫ 생성자의 이름은 클래스 이름과 동일
public class Circle{
public Circle(int r, String n){ // 생성자
....
}
}
≫ 생성자는 여러 개 작성(오버로딩) 가능
public class Circle{
public Circle(){...} // 매개 변수가 없는 생성자
public Circle(int r, String s){...} // 2개의 매개변수가 존재하는 생성자
}
≫ 생성자는 new를 통해 객체를 생성할 때 한 번만 호출
Circle pizza = new Circle(10, "자바피자"); // Circle(int r, String s) 생성자 호출
Circle donut = new Circle(); // Circle() 생성자 호출
≫ 생성자에 리턴 타입을 지정할 수 없다
- 리턴 값이 없다고 해서, void를 리턴 타입으로 지정하면 안 된다
- 생성자의 실행을 끝내고 싶으면, 코드 내 어디서든 return;문을 사용
public Circle(){...} // 리턴 타입 지정 X
//오류 Example
public void Circle(){...} // void를 리턴 타입으로 지정 X
≫ 생성자의 목적 : 객체가 생성될 때, 필요한 초기 작업을 위함
기본 생성자
≫ 자동 생성
- 생성자가 없는 클래스는 존재 X
- 생성자가 하나도 없는 경우, 컴파일러가 자동으로 생성
public class Circle {
int radius;
void set(int r) {radius = r;}
double getArea() { return 3.14*radius*radius};
//public Circle(){} // 눈에 보이지 않게 컴파일러가 자동 생성
public static void main(String[] args) {
Circle pizza = new Circle(); // 정상적으로 컴파일
pizza.set(3);
}
}
≫ 자동 생성 X
- 생성자가 하나라도 존재하면 컴파일러는 기본 생성자 삽입 X
public class Circle {
int radius;
void set(int r) {radius = r;}
double getArea() { return 3.14*radius*radius};
public Circle(int r){radius = r;}
public static void main(String[] args) {
Circle pizza = new Circle(10); // 매개변수가 1개인 생성자 호출
Circle donut = new Circle(); // 에러 : The constructor Circle() is undefined
}
}
this 레퍼런스
- 현재 객체 자신에 대한 레퍼런스
- 객체가 존재해야 사용 가능
public Circle(int radius) {radius = radius;}
- 2개의 radius 모두 매개변수 radius에 접근
-> 멤버 radius를 변경하지 못한다
public Circle(int radius){this.radius = radius;}
- this.radius : 멤버 radius / radius : 매개변수 radius
-> 멤버 radius 변경 가능
this()
- 클래스 내에서 생성자가 다른 생성자를 호출
public Book(String title){
this(title, "작자미상"); // Book(String title, String author)생성자 호출
}
public Book(String title, String author){
this.title = title;
thie.author = author;
}
주의점
- this()는 반드시 생성자의 첫 번째 문장
- this()는 반드시 생성자 코드에서만 호출
- this()는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용
객체 치환 시 주의점
Circle ob1 = new Circle(1);
Circle ob2 = new Circle(2);
s = ob2; // 1)
ob1 = ob2; // 2)
1) 실행
- s는 ob2가 가리키는 객체를 함께 가리킨다
2) 실행
- ob1의 레퍼런스가 ob2의 객체를 함께 가리킨다
-> 원래 ob1이 가리키던 객체는 아무도 가리키지 않게 되어 프로그램에서 접근 불가
-> 이러한 객체 = 가비지 (Garbage)