[Java] Java의 정석 (4) 객체지향개념 1
객체지향언어란?
객체지향언어의 특징
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. 리턴타입이 달라도 매개변수가 같으면 오버로딩이 성립하지 않는다.