공부/전자컴퓨터공학

Java 클래스(Class) & 객체(Object) 자바 기초 배우

차카이브 2024. 5. 23. 16:46
반응형
클래스(Class)와 객체

클래스(Class)란 객체를 정의한 설계도나 틀 정도로 정의할 수 있다. 즉 클래스는 객체를 생성하는데 사용되며, 반대로 객체는 클래스에 정의되고 설계된 내용 그대로 생성된다. 클래스는 객체 그 자체가 아닌 객체를 생성하는 하나의 틀이라고 볼 수 있다. 아래의 그림을 예로 들면 집 설계도가 집 자체가 될 수 없듯이 말이다. 클래스를 통해 생성된 객체들을 해당 클래스의 인스턴스 라고 하며, 클래스로부터 객체를  만드는 과정을 인스턴스화(instantiate)라고 한다.

객체와 인스턴스의 차이

같은 말이라서 차이를 두는 것에 큰 의미는 없지만 굳이 따지자면 객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고 있는 반면, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다. 위 그림의 예시에서 각각의 집은 일반적인 의미에서 객체이고 집이라는 클래스의 인스턴스 라고 할 수 있다.

 

클래스의 구성요소와 기본 문법

클래스는 class 키워드를 사용하여 아래와 같이 정의 할 수 있다. 클래스 명은 주로 대문자로 시작하는 것이 관례이다.

class 클래스명 { // 클래스 정의
	-- 생략 --
}

 

클래스는 필드(field), 메서드(method), 생성자(constructor), 이너클래스(inner class) 네가지 요소로 구성되어 있다. 

public class ExampleClass {
	int x = 10; // (1)필드
	void printX() {...} // (2)메서드
	ExampleClass {...} // (3)생성자
	class ExampleClass2 {...} // (4)이너 클래스
}
  • 필드: 클래스의 속성을 나타내는 변수로 자동차를 예로 들면 모델명, 컬러, 바퀴수 등이 포함될 수 있다.
  • 메서드: 클래스의 기능을 나타내는 함수이다. 자동차를 예로 들면 시동, 가속, 정지 등이 포함될 수 있다.
  • 생성자: 클래스의 객체를 생성하는 역할을 한다.
  • 이너클래스: 클래스의 내부의 클래스를 의미한다.

위의 요소중 생성자를 제외한 3가지 요소를 멤버(member)라고 부른다. 필드와 메서드는 각각의 클래스가 가지는 속성(state)과 기능(behavior)을 대표하며 속성과 기능은 해당 클래스와 관련된 데이터의 집합이며 핵심정보를 담고 있다고 할 수 있다.

 

객체(object)

객체의 생성은 new 키워드를 사용하여 할 수 있다. 먼저 클래스 타입의 참조변수를 선언하고, new 키워드와 생성자를 통해 인스턴스를 생성하여 참조 변수에 할당한다. 여기서 참조변수는 실제 데이터 값이 아닌 데이터가 저장되어있는 힙 메모리의 주소값을 가리킨다. new 키워드는 생성된 객체를 힙 메모리에 넣으라는 의미를 가지고 있는데 생성자를 통해 객체가 만들어지면 해당 객체를 힙 메모리에 넣는 역할을 수행하게 된다.

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

그림에서 볼 수 있는 것처럼 클래스 Person과 참조변수 p는 각각의 클래스 영역과 스택 영역이라는 다른 위치에 저장이 된다. 생성자로 만들어진 인스턴스는 힙 메모리 영역에 들어가며 객체 내부에는 클래스 멤버들이 위치하게 된다. 앞서 말한대로 참조변수는 객체의 실제 값이 아닌 힙에 저장되어있는 주소값을 가리킨다.

메서드 구현 코드는 클래스 영역에 저장되고 객체 안에서는 그 위치를 가리키고 있다. 즉, 같은 클래스로 만든 모든 객체는 동일한 메서드 값을 공유하기 때문에 여러번 같은 메서드를 선언해 주는 것이 아니라 한 번만 저장해 두고 필요한 경우에만 클래스 영역에 정의된 메서드를 찾아 사용할 수 있는 것이다.

 

객체의 활용

객체에 접근하고 이를 사용할 수 있는 방법은 포인트 연산자(.)를 사용하는 것인데 이는 해당 위치에 있는 객체 안을 보라는 뜻을 가지고 있다. 

참조 변수명.필드명 // 필드값 불러오기
참조 변수명.메서드명() // 메서드 호출

 

객체 예제 보기 
public class CarTest {
    public static void main(String[] args) {
        Car tesla = new Car("Model 3", "빨강"); // 객체 생성.

        System.out.println("내 차의 모델은 " + tesla.model + "이고 " + "색은 " + tesla.color + "입니다."); // 필드 호출
        tesla.power(); // 메서드 호출
        tesla.accelerate();
        tesla.stop();
    }
}

class Car {
    public String model; // 필드 선언
    public String color;

    public Car(String model, String color) { // 인스턴스 초기화를 위한 생성자 함수.
        this.model = model;
        this.color = color;
    }

    void power() { // 메서드 선언
        System.out.println("시동을 걸었습니다.");
    }

    void accelerate() {
        System.out.println("더 빠르게!");
    }

    void stop(){
        System.out.println("멈춰!!");
    }
}

// 출력값
내 차의 모델은 Model 3이고 색은 빨강입니다.
시동을 걸었습니다.
더 빠르게!
멈춰!!

 

위의 예제에서 먼저 model과 color의 속성을 가지며 power(), accelerate(), stop() 기능을 가진 Car class를 정의했다. CarTest 클래스 안에서 tesla 인스턴스를 만들어 앞서 정의한 속성과 기능을 println()메서드를 통해 출력한다.

반응형