자바에 대해서 이전 포스팅에 다룬 적이 있습니다. 여기서 간단하게 객체와 클래스에 대해서 언급한 적이 있었는데, 다시 한번 알아보도록 합니다.
프로그램은 기본적인 구성이 바로 데이터와 기능입니다. 이를 만들기 위해 데이터와 기능들을 묶어놓은 설계도가 바로 클래스입니다.
그리고 클래스의 경우에는 자바가 실행될 때, JVM의 메소드 영역에 올라가게 됩니다. 메소드 영역에 대한 자세한 설명은 저의 이 포스팅을 참고하시면 됩니다.
클래스를 만드는 방법은 class
라는 키워드를 사용하면 됩니다.
public class Ex01 {
int x = 5;
}
이렇게 하면 x = 5
라는 정보를 가진 하나의 설계도가 완성이 된 것입니다.
클래스에서는 변수와 기능들을 묶어 좀 더 유지보수가 편하게 됩니다. 이 때, 클래스 내부에 있는 변수들을 필드(Field) 라 하고, 기능들을 메소드(method) 라 합니다. 또한 나중에 객체 생성시, 내부 변수까지 원하는 값으로 초기화를 할 수 있는 것을 생성자(constructor) 라 합니다. 실제 코드에서는 아래와 같이 나타납니다.
public class TV {
// 필드
private String brand;
private int year;
private int inches;
// 생성자
public TV(String brand, int year, int inches) {
this.brand = brand;
this.year = year;
this.inches = inches;
}
// 메소드
public void show() {
System.out.println(this.brand + "에서 만든 " + this.year + "년형 " + this.inches + "인치 TV");
}
}
객체는 앞서 언급한 것 처럼 어떤 데이터와 기능들을 묶어놓은 집합이고, 도면으로 만든 어떤 사물과 같은 개념입니다.
앞선 포스팅의 내용을 인용하면,
으로 생각해볼 수 있습니다. 설계 도면으로 실제 책상을 계속 만들 수가 있는 것입니다. 기존에는 주먹구구식으로 책상을 하나씩 만들었다면, 설계 도면이 있다면 필요할 때 책상을 언제든지 만들 수가 있는 것입니다.
객체의 생성은 아래와 같이 진행할 수 있습니다. 위쪽에 있는 TV클래스를 사용하도록 하겠습니다.
public class Run {
public static void main(String[] args) {
TV myTV1 = new MyTV("삼성", 2020, 65);
TV myTV2 = new MyTV("LG", 2021, 55);
myTV1.show();
myTV2.show();
}
}
삼성에서 만든 2020년형 65인치 TV
LG에서 만든 2021년형 55인치 TV
이렇게 사용한 클래스 명은 같지만, 서로 다른 객체를 생성하였기에 다른 결과가 나오게 됩니다. 실제로 주소(정확히는 해시 코드)를 출력해보면 아래와 같습니다.
TV@74a14482
TV@1540e19d
서로 다르게 나왔기에 둘은 서로 다른 메모리 공간에 저장이 되어있다는 것을 알 수 있습니다.
기본적으로 myTV1
, myTV2
와 같은 변수들은 기본적으로 참조 변수입니다. 참조변수에 관한 포스팅은 이 포스팅을 참고하면 되지만, 정리하면 이 두 객체들은 heap 메모리 상에 다른 위치 및 주소를 가지고 있습니다. 그리고 실제 이 두 객체들이 있는 stack에서는 그 heap 메모리 상의 데이터를 참조할 뿐입니다.
객체가 실제하는 대상에 주목을 했다면 인스턴스는 관계에 초점을 둔 것입니다. 클래스, 객체, 인스턴스에는 다음과 같은 관계가 있습니다.
클래스의 인스턴스가 객체이다.
음... 뭔가 객체와 차이가 뭐지 할 수도 있는데 혼용해서 쓰는 경우도 있긴 합니다.
조금 더 자세한 차이점을 자바를 예시로 보면 아래와 같다고 할 수 있습니다.
TV tv = new MyTV();
여기서 객체는 Tv tv
에 해당하고, 인스턴스는 new MyTV()
라 볼 수 있습니다. 기본적으로 클래스의 정보가 메모리에 할당되는 그 순간에 인스턴스가 생성이 되고, 이것이 참조변수로 대표되는 객체에 대입이 되는 것을 알 수 있습니다.
이러한 개념들을 모아서 프로그래밍 하는 것을 객체 지향 프로그래밍(OOP, Object-Oriented Programming) 이라 합니다. 객체지향 프로그래밍과 그 특징에 대해서는 다음 포스팅에서 차근차근 올리도록 하겠습니다.