-> 블로그 이전

[Java] 클래스 / 객체

2021. 11. 18. 18:17Language`/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)