자바 기초를 공부하면서 객체지향 프로그래밍에 대한 개념을 확실하게 다져놓는것이 중요하다는 것을 느껴, 머릿속에 있는 객체지향 프로그래밍에 대한 희미한 개념을 글로서 확실하게 정리해보고자 한다.
객체지향 프로그래밍이란?
기존의 절차적 프로그래밍의 한계를 극복하고자 '객체'라는 개념을 통해 프로그램속에 담겨진 수많은 코드들을 보다 유기적인 관계를 맺어주기위한 하나의 프로그래밍 방법론.
캡슐화,추상화,상속,다형성등등...자바를 처음접해보는 입장에서 선뜻 이해하기힘든 어려운 개념들을 빼고 이해할수있는 만큼만 요약해본다면,
프로그램이 보다 정교해지고 다양한 기능들을 요구함에따라 코드들이 굉장히 복잡하게 뒤엉켜, 기능을 수정을 하거나 추가를 해야할때 어디서부터 손대야할지 막막한 문제점들이 발생하여,(=방이 너무 지저분하여)
서로 연관된 속성과 기능을 갖는 것들끼리 '객체'라는 이름으로 묶어(=옷은 옷대로,전자기기는 전자기기대로 박스에 차곡차곡 담아 정리하여), 이 '객체'들을 조립하여 프로그램을 만드는것! 이라고 이해하였다.
클래스(Class)
클래스란, 흔히 설계도라고 정의한다. '객체'를 생성하기위해 필요한 속성(변수)과 기능(메소드)들을 작성한 틀이라고 볼수있다. TV를 만들려면 벽걸이 TV, 80인치TV, 40인치 TV등등 여러가지 속성과 기능을 가진 TV들을 만들어야하는데,
적어도 이러한 모든 TV들은 '사각형의 lcd패널로 이루어져있고, 전원을 켜고끄는 기능, 채널을 돌리는 기능'등의 공통적인 틀을 가지고 있을 것이다. 이러한 공동적인 틀을 설계한것이 클래스라고 할수있다.
인스턴스(Instance)
이러한 클래스를 바탕으로 생성해낸 것이 객체(인스턴스)이다.
클래스를 작성하고, 클래스를 바탕으로 인스턴스를 생성하는 과정을 코드와 그림을 통해 살펴보자면,
class Tv {
int channel = 0;
int sound = 0;
void power() {
System.out.println("On");
}
}
public class ex3 {
public static void main(String[] args) {
Tv t1 = new Tv();
Tv t2 = new Tv();
}
}
먼저, Tv라는 클래스를 작성했는데, 변수 channel과 sound는 0 이라는 값을 가지고, power()라는 메소드를 가지고있다.
이러한 클래스를 바탕으로 main메소드에 new 연산자를 통해 인스턴스를 생성해주는 시점에,
해당 객체의 정보를 담은 인스턴스가 메모리에 할당되고, 이 메모리의 주소값을 t1이라는 참조변수에 저장한다.
이러한 과정을 그림으로 살펴보면 아래와 같다.
여기서 중요한 점은, 위의 각각 0x100, 0x200주소값을 가진 인스턴스들은
같은 클래스로부터 생성되었지만, 다른값을 가질수 있다.
그리고,이 인스턴스들은 참조변수를 통해서만 다룰수있다.
t1.channel = 1; 처럼 0x100주소값에 매핑된 t1이라는 참조변수를 통해서 해당 인스턴스에 접근할수있다는것이다.
또한, t1의 인스턴스의 channel 값은 1로 바뀌게 되고, t2의 인스턴스의 channel 값은 0이므로, 같은 Tv클래스의 channel이라는 변수지만 인스턴스끼리는 서로 다른값을 가질수있고, 이를 인스턴스 변수라 한다.
추가로 Tv클래스가 가진 channel은 클래스 변수, 메소드내에 선언된 변수는 지역변수라고 한다.
이처럼 이름은 같지만 필드가 다른 변수 혹은 메소드들을 static이나, this같은 개념을 통해 구분하거나, 사용범위를 제한할수있다!
그런데 만약 여기서, t2 = t1; 이라는 명령어를 작성하면 어떻게될까?
이를 이해하기위해 먼저 자바에서의 메모리 영역에 대해 이해할 필요가 있다.
자바의 모든 프로그램은 JVM(JavaVirtualMachine)을 통해서 실행된다.
자바로된 프로그램을 실행하면, 운영체제(OS)는 JVM에 필요한 메모리를 할당하고, JVM은 할당받은 메모리를 효율적으로 사용하기위해 위의 그림과 같이 공간을 나눈다.
이중, 참조변수는 Stack 영역, 인스턴스값은 Heap영역에 저장된다.
따라서, t2 = t1;이라는 명령이 실행되면 t1의 주소값 ( 0x100)을 t2의 주소값에 대입하게되고, t2가 가진 원래 주소값 0x200은 사라지게된다. 그렇게되면 0x200의 인스턴스값은 참조변수와의 연결이 끊어지게되고, 연결이 끊어진 인스턴스는
JVM의 가비지컬렉션(GarbageCollection)에 의해 삭제된다.
'Category > JAVA' 카테고리의 다른 글
[JAVA] 예외 처리 (0) | 2023.10.24 |
---|---|
[JAVA] 객체지향프로그래밍_2.상속과 다형성 (0) | 2023.10.22 |
[SpringBoot] GetMapping과 PostMapping (0) | 2023.10.13 |
[자바] 추상클래스와 인터페이스 (1) | 2023.10.11 |
[JAVA] Static 이란? (1) | 2023.10.10 |