개발일기/Java

[Java] Java의 정석 (4) 객체지향개념 1

Yoon Yusang 2025. 3. 4. 21:10
 

객체지향언어란?

 

객체지향언어의 특징

 

1. 기존 프로그래밍언어에 몇 가지 규칙을 추가한 것이다.

 

2. 코드의 재사용성이 높다

- 기존의 코드를 이용해 새로운 코드를 쉽게 작성할 수 있다.

 

3. 코드의 관리가 쉽다

- 코드 간의 관계를 맺어줌으로써 적은 노력으로 코드 변경이 가능하다.

 

4. 신뢰성이 높은 프로그램의 개발을 가능하게 한다.

- 제어자와 메소드를 이용해 데이터를 보호하고, 코드의 중복을 제거해 코드의 불일치로 인한 오류를 방지할 수 있다.

 

 

클래스와 객체

- 클래스 : 객체를 정의해 놓은 것으로, 객체를 생성하는 데 사용된다.

- 객체 : 실제로 존재하는 것으로, 객체의 속성과 기능마다 용도가 다르다.

 

 

인스턴스

- 인스턴스 : 객체와 유사하나, 특정 클래스의 객체임을 강조하는 의미로 자주 사용하는 용어

- 인스턴스화 : 클래스로부터 인스턴스를 생성하는 것.

 

 

객체의 멤버

- 객체는 속성과 기능으로 이루어져 있고, 속성과 기능을 객체의 멤버라고 한다.

- 속성은 변수로, 기능은 메소드로 정의하며, 클래스를 정의할 때 이에 유의하여 설계해야 한다.

 

 

인스턴스와 클래스

 

인스턴스의 생성

클래스명 참조변수명; // 객체를 다루기 위한 참조변수 선언
참조변수명 = new 클래스명(); // 객체 생성 후, 생성된 객체의 주소를 참조변수에 저장

클래스명 참조변수명 = new 클래스명(); // 위 코드를 한 줄로 줄인 코드

 

 

 

인스턴스의 사용

Tv t = new Tv();
t.channel = 7; // t의 멤버 channel에 접근
t.channelDown(); // t의 멤버 channelDown()을 실행

 

 

 

클래스의 또 다른 정의

 

1. 데이터와 함수의 결합 : 서로 다른 타입의 데이터를 저장할 수 있는 구조체로부터 발전된 개념)

 

2. 사용자 정의 타입 : 프로그래머가 직접 서로 관련된 값을 묶어서  정의한 새로운 타입

 

 

변수와 메소드

 

선언 위치에 따른 변수의 종류

 

- 변수의 선언위치가 변수의 종류와 범위를 결정한다.

변수의 종류 선언위치 생성시기
클래스변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스변수 인스턴스 생성시
지역변수 메소드 영역 변수 선언문 수행시
class Example
{
    int iv; // 인스턴스변수
    static int cv; // 클래스변수
    
    void method()
    {
    	int iv = 0; // 지역변수
    }
}

 

1. 인스턴스 변수

- 각 인스턴스의 개별적인 저장공간으로, 인스턴스마다 다른 값을 저장할 수 있다.

- 인스턴스 생성 후, 참조변수를 통해 접근한다.

- 인스턴스를 생성할 때 생성되며, 참조변수가 없을 때 GC에 의해 자동제거된다.

 

2. 클래스 변수

- 같은 클래스의 모든 인스턴스들이 공유하는 변수.

- 인스턴스 생성 없이, '클래스이름.클래스변수명' 으로 접근한다.

- 클래스가 로딩될 때 생성되며 프로그램이 종료될 때 소멸한다.

 

3. 지역 변수

- 메소드 내에 선언되며, 메소드의 종료와 함께 소멸된다.

 

 

메소드란?

- 작업을 수행하기 위한 명령문의 집합.

- 반복적인 코드를 줄이고 코드의 관리를 용이하게 한다.

 

* 하나의 메소드는 한 가지 기능만 수행하도록 작성하는 것이 좋다.

 

 

메소드를 정의하는 방법

반환타입 메소드이름 (타입 변수명, 타입 변수명, ... )
{
	// 메소드 호출 시 수행될 코드
}

 

 

 

JVM의 메모리 구조

 

1. 메소드 영역

- 클래스 정보와 클래스 변수가 저장되는 곳

 

2. 호출 스택

- 메소드의 작업 공간으로, 메소드가 호출되면 메소드 수행에 필요한 메모리 공간을 할당받고 메소드가 종료되면 사용하던 메모리를 반환한다.

 

3. 힙

- 인스턴스가 생성되는 공간으로, new연산자에 의해 생성되는 배열과 객체는 모두 여기 생성된다.

 

 

클래스 메소드와 인스턴스 메소드

1. 인스턴스 메소드

- 인스턴스 변수나 인스턴스 메소드와 관련된 작업을 하는 메소드.

- 인스턴스 생성 후, 참조변수를 통해 호출하며, 메소드 내에서 인스턴스 변수를 사용할 수 있다.

 

2. 클래스 메소드

- 인스턴스 변수나 인스턴스 메소드와 관련없는 작업을 하는 메소드.

- 인스턴스 생성 없이 '클래스이름.메소드이름()'으로 호출한다.

- 메소드 내에서 인스턴스 변수, 인스턴스 메소드를 사용할 수 없다.

 

* 메소드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙여 클래스 메소드로 정의하는 것을 고려하는 것이 좋다.

* 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있으나, static 멤버들은 인스턴스 멤버들을 참조할 수 없다.

 

 

메소드 오버로딩

- 하나의 클래스에 같은 이름의 메소드를 여러 개 정의하는 것.

- 매개변수가 다름에도 같은 의미의 기능을 수행시켜야 하는 경우에 사용하는 것이 좋다.

 

* 오버로딩의 조건

1. 메소드의 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

3. 리턴타입이 달라도 매개변수가 같으면 오버로딩이 성립하지 않는다.