nueijeel

[Java 이론] 0428 객체 지향 프로그래밍과 클래스 본문

Java

[Java 이론] 0428 객체 지향 프로그래밍과 클래스

nueijeel 2023. 5. 4. 22:03

2023.04.28

 

 

1. 객체 지향 프로그래밍 (Object Oriented Programming)

 

객체 지향 프로그래밍

: 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지 정의하여 객체들 간 상호작용을 이용해 프로그래밍하는 방법

 

 

객체 지향 프로그래밍 기법을 사용하면 기능들을 작은 단위로 나누기 때문에 유지보수에 용이하고, 객체들 간 독립성이 유지된다. 객체는 클래스를 통해 생성할 수 있다. 

 

 

 

2. 클래스

 

클래스

: 객체를 정의하는 틀 

 

[ 접근 제한자 ]  class  클래스 이름  {    }

위와 같이 클래스를 선언한다. 클래스 내부 body는 역할에 따라 멤버 변수와 멤버 메소드, 생성자로 구성된다. 접근 제한자와 생성자는 이후 다른 게시물에 작성할 예정이다.

 

이전 게시물에서 작성했던 식별자 부분을 상기시켜보면, 클래스 식별자는 첫 글자를 대문자로 작성해야하고 카멜 표기법을 따른다고 했다.

 

 

우선 멤버 변수와 멤버 메서드로 이루어진 클래스를 살펴보자.

class TestClass {
    //멤버 변수
    int a;
    //멤버 메서드
    public void print(){
    	System.out.println(a);
    }
}

 

정수형 변수 a를 멤버 변수로 가지고, 이 변수를 출력하는 print()메서드를 멤버 변수로 가지는 TestClass()를 구성했다.

그렇다면 클래스를 통해 객체를 어떻게 생성할까?

 

 

new  클래스 이름 () ;

객체를 생성하려는 클래스명과 new 키워드를 이용하면 해당 클래스를 통해 객체를 생성할 수 있다.

 

 

위에서 작성해본 클래스의 객체를 생성하는 코드를 작성하면 아래와 같다.

TestClass t1 = new TestClass();

 

여기서 객체를 생성하는 것은 대입연산자를 기준으로 오른쪽에 해당하는 new TestClass(); 부분이고, 왼쪽에 해당하는 TestClass t1은 TestClass형의 변수 t1을 선언한 구문이다. 여기서 t1에는 객체가 생성된 뒤 메모리에 저장되므로써 JVM이 객체에 부여하는 ID값이 담기게 되는데, 이 ID 값을 가진 변수 t1을 통해 우리는 객체에 접근할 수 있다. 따라서 변수 t1과 같이 선언된 변수를 객체 참조 변수라고 부른다.

 

 

System.out.println(t1.a1);
System.out.println(t1.print());

 

객체 참조 변수 t1을 통해 객체 멤버에 접근하려면 . 연산자를 이용하면 된다. [객체 참조 변수.멤버 변수] 또는 [객체 참조 변수.멤버 메서드] 형태로 사용한다.

 

 

 

- 멤버 변수

멤버 변수는 클래스 내에 선언되어 클래스 내부 사용이 자유로운 변수를 말한다

 

 

- 지역 변수

메서드 내부에 정의한 변수나 메서드의 매개변수를 지역변수라고 한다.

 

 

- 멤버 메서드

멤버 메서드에는 클래스가 가지는 기능들이 서술되어 있다.

 

[접근 제한자] [리턴 타입] 메서드명 ( [매개 변수] ) { 기능 }

메서드 선언 구문은 위와 같은 구조를 가진다.

 

 

public int add(int a, int b){
	return a + b;
}

 

return 키워드는 메서드 코드 수행 중 남은 코드를 실행시키지 않고 중단야 할 상황이나, 메서드 수행이 종료되어 해당 메서드를 호출한 원래의 코드로 되돌아가게 할 때 사용한다. 메서드가 종료될 때 return 키워드와 함께 값을 반환할 수도 있는데 이때는 메서드 선언부의 접근 제한자와 메서드 이름 사이 반환값의 타입을 반드시 지정해 줘야 한다. 이 코드에서는 정수형 변수 a와 b의 합을 반환하기 때문에 int를 반환 타입으로 지정했다.

 

메서드 이름 우측 괄호 안에는 메서드가 호출될 때 넘겨줘야 하는 값을 명시해 줄 수 있는데 이를 매개변수라고 한다. 매개변수가 있는 메서드를 호출할 때는 반드시 매개변수의 개수와 타입에 맞게 인자를 전달해야 한다.

 

 

 

3. Scope

 

scope

: 사용 시점 혹은 사용(유효) 범위를 의미한다

 

 

클래스에서 멤버 변수와 멤버 메서드는 객체가 생성됨과 동시에 메모리에 저장되고, 객체가 소멸되면 함께 소멸된다. 따라서 멤버 메서드를 사용할 때 멤버 변수가 메모리에 저장된 것을 보장받을 수 있기 때문에 멤버 메서드 내에서 멤버 변수의 사용이 자유롭다.

 

하지만 지역 변수의 경우에는, 메서드가 호출될 때 생성되었다가 메서드가 종료될 때 소멸되기 때문에 해당 지역 변수가 선언되어 있는 메서드 내에서만 사용이 자유롭다.

 

자바는 block scope를 따르기 때문에 각 요소들이 선언된 블럭 {} 내에서만 사용 가능하다.

 

 

 

4. 객체 소멸 시점

 

자바에서는 객체에 대한 객체 참조 변수가 하나도 없을 때 해당 객체를 소멸 대상으로 보는데, 메모리 청소가 수행되면 소멸 대상 객체는 전부 메모리에서 소멸된다. 객체 참조 변수에 null을 대입하면 해당 변수가 어떤 객체도 참조하지 않게 되기 때문에 원래 참조했던 객체는 소멸 대상이 된다.

 

public class MainClass {
	public static void main(String[] args) {
		TestClass1 t1 = new TestClass1();
		System.out.printf("t1: %s\n", t1);
		
		t1.testMethod1();
		
		t1 = null;

		for(int i = 0; i < 100; i++) {
			System.out.println(i);
			//가비지 컬렉터 가동
			System.gc();
		}
	}

}
class TestClass1{
	public void testMethod1() {
		System.out.println("testMethod1이 호출되었습니다");
	}
}

 

코드에서 TestClass1의 객체를 생성하고 t1.testMethod1()로 멤버 메서드를 호출한다. 이후 객체 참조 변수에 null을 대입하면 TestClass1의 객체에 접근할 수 있는 방법이 없기 때문에 해당 객체는 소멸 대상이 된다. 가비지 컬렉터를 가동하여 메모리 청소를 수행하면 객체가 메모리상에서 소멸된다.

 

 

< 메모리 청소 시점 >
1. 개발자가 코드를 통해 명시적으로 메모리 청소를 명령했을 때
2. JVM이 메모리가 부족하다고 생각할 때
3. OS가 메모리가 부족하다고 생각할 때

 

 

- 가비지 컬렉터 

 

Garbage Collector

: JVM의 Heap 영역에 존재하는 메모리 청소 SW. GC가 실행될 때 다른 작업들은 중지되고, 사용되는 메모리와 사용되지 않는 메모리가 식별되면 이에 따라 메모리를 청소한다.

 

Java와 Kotlin에서는 GC가 주기적으로 검사하여 메모리를 청소해준다. 프로그램 내에서 개발자가 직접 GC를 호출해 작동시킬 수 있지만 시스템 성능에 부담되는 작업이기 때문에 지양한다...

728x90