

1. 객체지향언어
객체지향언어의 기본 개념
실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용
객체지향언어의 주요 특징
- 코드의 재사용성이 높음
- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성 가능
- 코드의 관리가 용이
- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있음
- 신뢰성이 높은 프로그래밍을 가능하게 함
- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있음
=> 코드의 재사용성이 높고 유지보수가 용이
2. 클래스와 객체
- 클래스
- 정의 : 객체를 정의해 놓은 것
- 용도 : 객체를 생성하는데 사용
- 객체
- 정의 : 실제로 존재하는 것. 사물 또는 개념
- 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
클래스의 인스턴스화(instantiate) : 클래스로부터 객체를 만드는 과정
클래스의 인스턴스(instance) : 클래스로부터 만들어진 객체
객체 = 속성 + 기능
- 속성(property)
- 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
- 기능(function)
- 메서드(method), 함수(function), 행위(behavior)
2.1. 인스턴스의 생성과 사용
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv클래스로부터 인스턴스를 생성하고, 인스턴스의 속성과 메서드를 사용하는 예제
class Tv {
//Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원상태
int channel; //채널
//Tv의 기능(메서드)
void power() { power = !power}
void channelUp { ++channel; }
void channelDown() { --channel; }
}
class TvTest {
public static void main(String args[]) {
Tv t; //Tv인스턴스를 참조하기 위한 변수 t를 선언
t = new Tv(); //Tv인스턴스를 생성
t.channel = 7;
t.channelDown();
System.out.println("현재 채널은 " + t.channel + " 입니다.");
}
}
인스턴스는 참조 변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야함
2.2. 객체 배열
객체 배열 : 배열로 객체를 다루는 것
Tv[] tvArr = new Tv[3]; //참조변수 배열(객체 배열)을 생성
//객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
2.3. 클래스의 또 다른 정의
프로그래밍적인 관점에서 클래스의 정의와 의미
- 클래스 - 데이터와 함수의 결합
- 클래스 - 사용자정의 타입(user-defined type)
3. 변수와 메서드
3.1. 변수
class Variables
{
//클래스 영역
int iv; //인스턴스 변수
static int cv; //클래스변수(static 변수, 공유 변수)
void method()
{
//메서드 영역
int lv = 0; //지역 변수
}
}
변수의 종류 | 선언위치 | 생성시기 |
클래스변수(class variable) | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스변수(instance variable) | 클래스 영역 | 인스턴스가 생성되었을 때 |
지역변수(local variable) | 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
- 인스턴스 변수
- 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐
- 따라서 먼저 인스턴스를 생성한 후에 인스턴스 변수의 값을 읽어오거나, 저장 가능
- 독립적인 저장 공간을 가지므로, 서로 다른 값을 가질 수 있음
- 클래스 변수
- 인스턴스 변수 앞에 static을 선언
- 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유
- 인스턴스를 생성하지 않고도 바로 사용 가능
- 지역 변수
- 메서드 내에 선언되어 메서드 내에서만 사용가능
- 메서드가 종료되면 소멸되어 사용 불가
3.2. 메서드
메서드(method) : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
메서드를 사용하는 이유
- 높은 재사용성
- 중복된 코드의 제거
- 프로그램의 구조화
3.3. JVM의 메모리구조

- 메서드 영역(method area)
- 프로그램 실행 중, 어떤 클래스가 사용되면 JVM은 해당 클래스의 클래스 파일을 읽어서 분성하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장
- 힙(heap)
- 인스턴스가 생성되는 공간
- 호출스택(call stack 또는 execution stack)
- 메서드의 작업에 필요한 메모리 공간을 제공
- 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용
3.4. 기본형 매개변수와 참조형 매개변수
자바에서 메서드를 호출할 때 매개변수로 지정한 값을 매개변수에 복사해서 넘겨줌
- 기본형 매개변수
- 변수의 값을 읽기만 할 수 있음
- read only
- 참조형 매개변수
- 변수의 값을 읽고 변경할 수 있음
- read & write
- 값이 저장된 곳의 주소를 알 수 있음
3.5. 클래스 메서드(static 메서드)와 인스턴스 메서드
클래스 : 데이터(변수)와 데이터에 관련된 메서드의 집합
- 클래스 메서드 = static 메서드
- 메서드 앞에 static이 붙어있음
- 객체를 생성하지 않고도 '클래스이름.메서드이름()'으로 호출 가능
- 인스턴스와 관계 없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드
- 인스턴스 메서드
- 반드시 객체를 생성해야 호출 가능
- 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙임
- 클래스 변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있음
- 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없음
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려
4. 오버로딩(overloading)
오버로딩 : 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것
오버로딩의 조건
- 메서드 이름이 같아야 함
- 매개변수의 개수 또는 타입이 달라야 함
5. 생성자(Constructor)
생성자 : 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
생성자의 조건
- 생성자의 이름은 클래스의 이름과 같아야 함
- 생성자는 리턴 값이 없음
생성자가 수행되는 단계
Card c = new Card();
- 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성
- 생성자 Card()가 호출되어 수행
- 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장
5.1. 기본 생성자(default constructor)
모든 클래스에는 반드시 하나 이상의 생성자가 정의되어야 함
컴파일 시, 소스파일의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 추가하여 컴파일 함
즉, 매개변수가 있는 생성자를 정의하면 기본 생성자도 무조건 추가해야 컴파일 에러가 나지 않음
5.2. 생성자에서 다른 생성자 호출하기 - this(), this
생성자 간 서로 호출이 가능하기 위한 조건
- 생성자의 이름으로 클래스이름 대신 this를 사용
- 한 생성자에서 다른 생성자를 호출할 때는 만드시 첫 줄에서만 호출이 가능
Car() {
color = "white";
gearType = "auto";
door = 4;
}
//생성자간 호출
Car() {
this("white", "auto", 4);
}
- this
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스의 주소가 저장되어 있음
- 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재
- this(), this(매개변수)
- 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용
6. 변수의 초기화
멤버변수(클래스 변수와 인스턴스 변수)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적
멤버변수의 초기화 방법
- 명시적 초기화(explicit initialization)
- 생성자(constructor)
- 초기화 블럭(initialization block)
- 인스턴스 초기화 블럭 : 인스턴스 변수를 초기화 하는데 사용
- 클래스 초기화 블럭 : 클래스 변수를 초기화 하는데 사용
6.1. 명시적 초기화(explicit initialization)
명시적 초기화 : 변수를 선언과 동시에 초기화 하는 것
6.2. 초기화 블럭(initialization block)
- 인스턴스 초기화 블럭
- 인스턴스 변수의 복잡한 초기화에 사용
- 단순히 클래스 내에 블럭을 만들고, 그 안에 코드 작성
- 클래스 블럭
- 클래스 변수의 복잡한 초기화에 사용
- 인스턴스 초기화 블럭 앞에 단순히 static을 덧붙임
6.3. 멤버 변수의 초기화 시기와 순서
- 클래스 변수의 초기화 시점
- 클래스가 처음 로딩될 때 단 한번 초기화 됨
- 인스턴스 변수의 초기화 시점
- 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어짐
- 클래스 변수의 초기화 순서
- 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
- 인스턴스 변수의 초기화 순서
- 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자
'study > Java의 정석' 카테고리의 다른 글
[Java의 정석] Chapter 8 예외처리 (0) | 2023.03.22 |
---|---|
[Java의 정석] Chapter 7 객체지향 프로그래밍2 (0) | 2023.03.21 |
[Java의 정석] Chapter 5 배열 (0) | 2023.03.07 |
[Java의 정석] Chapter 4 조건문과 반복문 (0) | 2023.03.07 |
[Java의 정석] Chapter 3 연산자 (0) | 2023.03.07 |