Don't give up!

[JAVA] 자바의 정석 정리(6장) 본문

개발서적/JAVA의 정석

[JAVA] 자바의 정석 정리(6장)

Heang Lee 2021. 5. 12. 00:08
자바의 정석을 읽고 정리한 내용입니다.

Java의 정석 - YES24

 

Java의 정석

최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 `자바의 정석`의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을 잘 파악하고 쓴 책. 뿐만 아

www.yes24.com


1. 객체지향언어

(1) 코드의 재사용성이 높다.

(2) 코드의 관리가 용이하다.

(3) 신뢰성이 높은 프로그래밍을 가능하게 한다.

(4) 객체지향개념에 얽매여서 고민하기 보다는 일단 프로그램을 기능적으로 완성한 다음 객체지향적으로 코드를 개선할 수 있을지를 고민하여 점차 개선해 나가는 것이 좋다.

2. 클래스와 객체

(1) 클래스란 객체를 정의해 놓은 것.

(2) 객체는 클래스에 정의된 내용대로 메모리에 생성된 것.

(3) 인스턴스(instance)는 클래스로부터 만들어진 객체. 클래스로부터 만드는 과정을 클래스의 인스턴스화(instantiate)라고 한다. 인스턴스와 객체는 같은 의미.

3. 변수

변수의 종류 선언위치 생성시기
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수 인스턴스가 생성되었을 때
지역 변수 매서드, 생성자, 초기화 블럭 내부 변수 선언문이 수행되었을 때

(1) 인스턴스 변수 - 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐. 독립적인 저장공간을 가진다.

(2) 클래스 변수 - 인스턴스 변수 앞에 static을 붙임. 모든 인스턴스가 공통된 저장공간을 공유한다. 인스턴스 생성 없이 언제라도 바로 사용할 수 있음. '클래스이름.클래스변수'의 형식으로 사용. 메모리에 로딩될 때 생성되어 프로그램 종료까지 유지되며 전역변수의 성격을 갖는다.

(3) 지역 변수 - 블럭 내에 선언된 지역변수는 블럭을 벗어나면 소멸되어 사용할 수 없음.

4. 메서드

(1) 메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것. 높은 재사용성, 중복된 코드 제거, 프로그램의 구조화의 장점이 있다.

(2) 메서드의 return문은 반환값의 타입이 메서드의 반환 타입과 일치하거나 적어도 자동 형변환이 가능한 타입이어야 한다. (void인경우 생략할 수 있다. 컴파일러가 자동적으로 추가해준다.)

(3) 메서드 앞에 static이 붙어 있으면 클래스메서드이고 붙어있지 않으면 인스턴스 메서드이다. 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드를 클래스 메서드로 정의하는 것이 일반적이다. 메서드 호출시간이 짧아지므로 성능이 향상된다.

5. JVM 메모리 구조

(1) 메서드 영역 - 클래스가 사용되면 해당 클래스의 클래스파일을 읽고 분석하여 클래스 데이터를 저장. 클래스변수도 이 영역에 함께 생성된다.

(2) 힙 - 인스턴스 변수들이 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 힙에 저장된다.

(3) 호출 스택 - 메서드의 작업에 필요한 메모리 공간을 제공. 메서드를 위한 메모리가 할당되며 지역변수들과 연산의 중간 결과 등을 저장하는데 사용. 메서드가 작업을 마치면 해당 메모리 공간은 반환되어 지워진다.

6. 오버로딩

(1) 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것.

(2) 메서드의 이름이 같아야 하고 매개변수의 개수 또는 타입이 달라야 한다. (반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

(3) 오버로딩을 통해 같은 이름의 메서드들이 같은 기능을 할 것이라고 예측하도록 할 수 있다.

(4) 가변인자는 내부적으로 배열을 이요함으로서 메서드의 매개변수 개수를 늘리는 오버로딩을 대체할 수 있다.

String concatenate(String s1, String s2) {...}
String concatenate(String s1, String s2, String s3) {...}
String concatenate(String s1, String s2, String s3, String s4) {...}

String concatenate(String... str) {...}

7. 생성자

(1) 클래스에 정의된 생성자가 하나도 없을 때에만 컴파일러는 기본 생성자를 추가한다.

(2) 생성자에서 다른 생성자를 호출할 때에는 첫 줄에서만 호출이 가능하며 생성자의 이름으로 클래스이름 대신 this를 사용해야 한다.

class Car {
String color;
    String gearType;
    int door;
    Car() {
    	this(color,"auto",4);
    }
    Car(String color){
    	this(color,"auto",4);
    }
    Car(String color, String gearType, int door){
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

8. 변수의 초기화

(1) 멤버변수는 초기화 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어진다.(지역변수의 초기화는 필수)

(2) 명시적 초기화 - 변수를 선언과 동시에 초기화하는 것.

(3) 초기화 블럭은 멤버변수를 초기화하는 다른 방법. 단순히 클래스 내에 {} 블럭을 만들면 인스턴스 초기화 블럭, static{}블럭을 만들면 클래스 초기화 블럭이다. 생성자보다 인스턴스 초기화 블럭이 먼저 수행된다.