클래스(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()메서드를 통해 출력한다.
'공부 > 전자컴퓨터공학' 카테고리의 다른 글
생성자(Constructor)란? 자바 기초 배우기 (0) | 2024.05.26 |
---|---|
필드(Field)와 메서드(Method) 자바 기초 배우기 (0) | 2024.05.26 |
Java 배열(Array) 자바 기초 배우기 (0) | 2024.05.22 |
Java 제어문(Control Flow Statements) 조건문과 반복문 (2) | 2024.05.22 |
Java 연산자(Operator) 및 콘솔 입출력 Java 기초 배우기 (0) | 2024.05.09 |