[Java] 클래스와 객체

2024. 5. 8. 19:30Backend/Java

728x90

🎯클래스와 객체

1. 클래스와 객체의 정의와 용도

클래스란 '객체를 정의해놓은것.' 또는 클래스는 '객체의 설계도 또는 틀' 이라고 정의할 수 있다.

클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.

 

객체의 사전적인 정의는, '실제로 존재하는것' 이다. 우리가 주변에서 볼 수 있는 책상, 의자, 자동차와

같은 사물들이 곧 객체이다. 객체지향이론에서는 사물과 같은 유형적인 것 뿐만 아니라,

개념이나 논리와 같은 무형적인 것들도 객체로 간주한다.

> 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

  • 유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물
  • 무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념

1.2 객체와 인스턴스

클래스로부터 객체를 만드는 광정을 클래스의 인스턴화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를

그 클래스의 인스턴스(instance)라고 한다.

인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 가지고 있으며,

인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 구체적인 의미를 가지고 있다.

둘은 같은 의미이므로 용어의 사용을 엄격히 구분할 필요는 없지만, 문맥에 따라 구별하여 사용하자.
ex) 책상은 인스턴스다 x 책상은 객체다 o

      책상은 책상 클래스의 객체이다 x 책상은 책상 클래스의 인스턴스다 o

 

1.3 객체의 구성요소 - 속성과 기능

객체는 속성과 기능, 두 종류의 구성 요소로 이루어져 있다.

클래스는 객체를 정의한 것이므로 클래스에는 객체의 모든 속성과 기능을 가진 객체가 만들어 진다.

  • 속성(property) : 멤버변수(member variaable), 특성(attribute), 필드(field), 상태(state)
  • 기능(function) : 메서드(method), 함수(function), 행위(begavior)
class Tv {
        String color;   // 색깔
        boolean power;	// 전원상태
        int chnnel;	// 채널

        void power()        {power = !power; }
        void chnnelUp()     {chnnel++;}
        void chnnelDown()   {chnnel--;}
    }

속성과 기능을 가진 Tv 클래스를 만들어 보았다.

 

2. 인스턴스의 생성과 사용

클래스로부터 인스턴스를 생성해야지만 클래스 안에있는 객체들을 사용할 수 있다.

일반적인 클래스로부터 인스턴스를 생성하는 방법을 알아보겠다.

클래스명 변수명;			// 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명();		// 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv t;				// Tv클래스 타입의 참조변수 t를 선언
t = new Tv();			// Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

Tv t = t new Tv(); 처럼 한번에 사용해도 상관없다.

 

다음은 인스턴스의 생성과 사용방법 예시 입니다.

class Tv {
    String color;
    boolean power;
    int chnnel;

    void power()        {power = !power; }
    void chnnelUp()     {++chnnel;}
    void chnnelDown()   {--chnnel;}
}

class TvTest {
    public static void main(String[] args) {
        Tv t = new Tv();
        t.chnnel = 7;
        t.chnnelDown();
        System.out.println("현재 채널은 " + t.chnnel + " 입니다.");
    }
}

실행결과 : 현재 채널은 6 입니다.

 

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.

 

3. 생성자

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.

인스턴스 변수의 초기화 작업에 주로 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서

도 사용된다.

 

생성자는 메서드와 비슷한 구조이지만 리턴 값이 없고, 클래스의 이름과 같아야 한다.

 

3.1 기본 생성자

클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.

하지만 클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가

자동적으로 기본 생성자를 추가하여 컴파일하기 때문이다.

 

기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

 

3.2 매개변수가 있는 생성자

생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받을 수 있다.

 

3.3 생성자 예시

// 기본 생성자
class Car {
    String color = "black";
    String gearType;
    int door;
// Car() {}  생략 가능
}

class Car2{
    String color;
    String gearType;
    int door;
// 매개변수가 있는 생성자
    Car2(String c, String g, int d) {
        color = c;
        gearType = g;
        door = d;
    }

}

public class Test {
    public static void main(String[] args) {
    // 기본 생성자 객체 생성
        Car c1 = new Car();
        System.out.println(c1.color);		// 출력 : black
        
	// 매개변수가 있는 생성자 객체 생성
        Car2 c2 = new Car2("white", "auto", 4);
        System.out.println(c2.color + " " + c2.gearType + " " + c2.door);	// 출력 : white auto 4
    }
}

 

4. this(), this

this : 인스턴스의 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로
숨겨진 채로 존재한다. 인스턴스변수와 매개변수의 이름이 같을 때 사용

 

this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

this() 사용조건

  • 생성자의 이름으로 클래스이름 대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

  • this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것이다. this는 참조 변수이고, this()는 생성자이다.

 

4.1 this(), this 예시

class Car{
    String color;
    String gearType;
    int door;

    Car(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door = door;
        //인스턴스변수와 매개변수이름이 같아 this키워드로 구분
    }

    Car() {
        this("white", "auto", 4); // this()로 또 다른 생성자 호출
    }

    Car(String color){
        this(color, "auto", 4);
    }

    public void CarInfo() {
        System.out.println("color: " + color + ", gearType: " + gearType + ", door: " + door);
    }
}

public class Test {
    public static void main(String[] args) {
       Car c1 = new Car();
       Car c2 = new Car("blue");
        System.out.print("c1의 "); c1.CarInfo();
        // 출력 : c1의 color: white, gearType: auto, door: 4
        System.out.print("c2의 "); c2.CarInfo();
        // 출력 : c2의 color: blue, gearType: auto, door: 4
    }
}

 

  • Car 클래스의 3개의 생성자를 만들었다
  • 주 생성자에 매개변수를 넣서 this키워드로 인스턴스변수와 매개변수를 구분했다.
  • 주 생성자에서 또 다른 생성자를 호출하기위해 this()를 사용했다.

'Backend > Java' 카테고리의 다른 글

[Java] 상속  (0) 2024.05.09
[Java] 클래스와 객체2  (0) 2024.05.09
[Java] 반복문  (0) 2024.05.06
[Java] 조건문  (0) 2024.05.06
[Java] 변수와 자료형  (0) 2024.05.06