본문 바로가기

한권떼기/자바의 정석

[한권떼기] 자바의정석 챕터06. 객체지향프로그래밍 기본개념

728x90
반응형

**자바의 정석(남궁성 저)를 읽고 정리한 글입니다.

 

객체지향언어란?

객체 지향 언어는 기존의 프로그램이 언어에서 규칙을 더하여 객체지향성을 보장하도록 한 언어

객체 지향 언어의 장점

1. 코드의 재사용성

2. 코드 관리의 용이 (유지보수 용이)

3. 신뢰성이 높은 프로그램이 가능 (코드의 중복 제거 및 데이터를 보호하고 오류를 최소화함)

 

 

클래스와 객체

클래스: 객체를 정의해 놓은 것. 비유하자면 붕어빵 틀과 같음

객체: 클래스에 정의된 내용대로 메모리에 올라간 실체가 있는 것. 붕어빵 틀로 찍어낸 붕어빵.

클래스로부터 객체를 만들어내는 것을 인스턴스화라고 하며, 클래스 -> 인스턴스화 -> 인스턴스(객체) 의 흐름으로 객체가 만들어짐

 

메모리 상에서의 클래스 객체

 

객체의 구성요소

객체는 속성과 기능으로 구성되어있음

속성은 멤버변수, 특성, 상태 등 객체가 가지는 특성들이고, 기능은 이 특성을 변화시키는 메소드, 함수 등임

 

구조체 vs 클래스?
구조체: 서로 관련된 여러 데이터를 타입과 관계 없이 하나로 모아둔 공간
클래스: 데이터+함수의 결합체 (구조체+함수)

 

 

변수와 메소드

변수는 클래스 변수, 인스턴스 변수, 지역변수 세 가지가 있음

 

클래스 변수

클래스의 멤버 변수 중 static이 붙은 변수

클래스가 메모리에 올라가면 (클래스가 필요해진 시점에 JVM이 메모리에 올릴 때) 생성됨

모든 인스턴스가 공통된 저장공간을 공유하므로, 하나의 인스턴스에서 클래스 변수를 변경하면 다른 곳에도 다 영향을 미치게 됨

인스턴스 변수

클래스의 멤버 변수 중 static이 붙지 않은 변수

클래스의 인스턴스가 만들어지면 함께 생성되어 인스턴스 각각이 다른 값을 가지게 됨

지역변수

메소드 영역, 생성자 등 내부에 선언된 변수나 메소드의 매개변수

메소드가 종료되거나 블럭을 벗어나면 소멸되어 사용할 수 없음

 

 

JVM의 메모리 구조

JVM의 메모리 구조

메소드 영역

프로그램 실행 중 필요한 클래스가 생기면, JVM이 클래스파일을 읽고 분석하여 클래스 데이터(+클래스 변수)를 메소드 영역에 저장

인스턴스(+인스턴스 변수)가 생성되는 공간

호출스택

메소드의 작업에 필요한 메모리 공간

메소드가 호출되면 호출된 메소드를 위한 메모리(+지역변수, 매개변수 등...)가 호출스택에 할당됨

메소드 작업이 끝나면 할당된 메모리 공간은 반환됨

메소드의 호출 순서에 따라서 스택으로 쌓이게 됨

따라서 호출스택 가장 위의 메소드가 현재 실행중인 메소드, 그 아래에 있는 메소드가 위의 메소드를 호출한 메소드임

 

 

클래스 메소드(static 메소드)와 인스턴스 메소드

클래스 메소드

인스턴스와 관계없는 메소드

모든 인스턴스에 공통적으로 사용되는 것에 static을 붙여 클래스 메소드로 사용

인스턴스를 생성하지 않아도 접근 및 사용이 가능함(클래스가 메모리에 올라갈 때, 즉 클래스가 필요해진 시점에 자동적으로 생성됨)

실행 시점에 인스턴스가 존재하는지 확신할 수 없으므로, 메소드 내부에서 인스턴스 변수를 사용할 수 없음

인스턴스 메소드의 경우, 실행 시에 호출할 메소드를 찾는 데에 시간이 걸리기 때문에 클래스 메소드를 사용하면 호출시간이 짧아져 성능이 향상됨

인스턴스 메소드

인스턴스 메소드는 인스턴스 변수를 가지고 메소드의 작업을 수행하는 메소드임

 

 

오버로딩(overloading)

오버로딩이란 한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것

메소드 이름이 같고, 매개변수의 개수 또는 타입이 달라야 오버로딩이 가능 (반환 타입만 다른 것은 오버로딩할 수 없음)

 

생성자(Constructor)

생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화를 위한 메소드임

생성자 이름은 클래스 이름과 같아야하며, 리턴 값이 없음

생성자를 따로 만들지 않았으면 메소드 내부가 비어있고 매개변수가 없는 기본 생성자가 자동으로 컴파일러에 의해 만들어짐

 

생성자를 통해 인스턴스가 생성되는 단계

1. 연산자 new에 의해 힙에 클래스의 인스턴스 생성

2. 생성자 클래스명()이 호출 및 수행

3. 생성된 클래스 인스턴스의 주소가 결과로 반환되어 참조변수에 저장됨

 

this()와 this

this

생성자의 이름으로 클래스 이름 대신 this를 사용 (ex. this.temp)

this는 인스턴스 메소드에 숨겨져있는 지역변수이자 참조변수로 인스턴스 자신을 가리키며, 인스턴스의 주소가 this에 저장되어 있음

this(), this(매개변수)

같은 클래스의 다른 생성자를 호출 할 때에 사용

this vs this()
this()와 this와 비슷하게 생겼으나 this()는 변수가 아닌 생성자이고, this는 인스턴스의 주소를 저장한 참조변수입니다.

 

 

변수의 초기화

멤버변수는 초기화를 하지 않아도 알아서 기본값으로 초기화되지만, 지역변수는 반드시 사용전에 초기화가 필요함

 

초기화 블럭

class Hello {
    static {
    	//클래스 초기화 블럭
    }
    {
    	//인스턴스 초기화 블럭
    }
}

클래스변수와 인스턴스변수를 초기화 하기 위해서 초기화블럭이 사용됨

이 때 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한 번만 수행됨

인스턴스 초기화 블럭은 인스턴스 생성시마다 수행되며, 생성자보다 먼저 수행됨

 

클래스변수, 인스턴스 변수의 초기화 순서

클래스변수

클래스가 처음 로딩 될때 딱 한번 초기화되며

기본값 -> 명시적초기화 (ex. int classVal = 1;) -> 클래스 초기화 블럭

인스턴스 변수

인스턴스 생성시마다 초기화됨

기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자에서 초기화

 

 

 

728x90
반응형