자바의 정석

자바의 정석 6장

그zi운아이 2023. 6. 13. 11:11

이 글은 Java의 정석 3rd Edition을 읽고 정리한 내용입니다.

Chapter 6

객체지향 프로그래밍1


1. 객체지향언어 

  • 코드의 재사용성이 높다(상속과 다형성을 이용해 재상용성을 높일 수 있다)
  • 코드의 관리가 용의하다(SRP와 같은 원칙을 사용하여 유지보수가 용이하다)
  • 신뢰성이 높은 프로그래밍을 가능하게 한다.
  • 객체의 개념에 얽매이지 말고 기능적으로 완성한 다음 객체지향적으로 코드를 개선해 나가는 것이 좋다.

2.클래스와 객체

클래스의 정의 : 클래스란 객체를 정의해 놓은 것이다.

클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.

 

객체의 정의 : 실제로 존재한는것, 사물 또는 개념

갬체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

 

객체의 구성요소 속성과 기능

객체지향언어를 공부하면서 객체란 무엇인가에 대한 고민을 많이했었다. c언어에서 구조체를 객체라고 할 수 있을까. 객체지향언어의 장점은 재사용성인데 c언어도 함수를 사용하는건 똑같은데 왜 객체지향언어는 재사용성이 좋은가 이런 고민을 했었다. 첫번쨰 고민의 답은 구조체는 데이터를 편하게 다루기 위한 공간이고 객체는 데이터와 기능의 집합이라고 생각한다.

 

객체는 속성과 기능으로 이루어 지며 객체를 구상할땐 행동을 기준으로 상태 나타내야 한다.

속성 : 맴버변수, 특성,필드,상태

기능 : 메서드, 함수, 행위


3.변수와 메서드

변수의 종류 선언 위치 생성 시기
클래서변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스변수 인스턴스가 생성되었을 때
지역변수 클래스 영역 이외의 영역 변수 선언문이 수행되었을 떄

인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 다른 값을 유지할 수 있지만, 클레스는 하나으 ㅣ저장공간을 공유하므고 항상 공통된 값을 갖는다.

 

메서드

메서드란 특정 작업을 수행하는 문장을 하나로 묶은 것이다. 수학의 함수와 유사하며 보통 동사로 이름을 나타 낸다.

 

메모드의 장점

  • 눞은 재사용성 : 한번 작성해 두면 여러번 호출하여 사용할 수 있다.
  • 중복된 코드의 제거 : 높은 재사용성과 연결된 부분으로 한번 만 작성하면 되기 때문에 중복 코드를 제가할 수 있다.
  • 프로그램의 구조화 : 대규모 프로그램에서 메소드를 사용하지 않고 한번에 다 사용한다면 구조가 몹시 복잡해 질 것이다 .

기본형 매개변수와 참조형 매개변수

  • 기본형 매개변수 : 변수의 값을 읽기만 할 수있다.
  • 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.
  • 참조형 매개변수의 경우엔 주소를 가지고 오는것이기 때문에 그주소에 접근해 값을 변경한다면 실제 데이터의 값도 변경된다.

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

인스턴스 메서드는 인스턴스 변수와 관련된 작업을 수행한다.

인스턴스 메서드 혹은 인스턴스 변수를 사용하지 않는 메서드는 static을 적어 클래스 메서드로 정의한다.

  1. 클래스를 설계할 때 맴버 변수 중 모든 인스턴스에 공통으로 사용하는 것이 staic을 붙인다.
  2. 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 멧드는 인스턴스 변수를 사용할 수 없다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

4. 오버로딩 

오버로딩이란 한 클래스 내에 같은 이름의 메서드르 여러 개 정의하는 것을 메서드 오버로딩 이라고 한다,

 

오버로딩의 조건

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

오버로딩의 장점

단지 이름만으로 메서드를 구별한다면. 한 클래스 내의 모든 메서드들의 이름이 달라져야 한다.

println()으로 편리하게 사용하던 메소드가 printStringln() printIntln(),pringBooleanln() 처럼 작성해야 할 것이다. 개발자 입장에서 모든 메서드의 이름을 기억하기 어렵기에 오버로딩을 사용하면 오류의 가능성을 많이 줄일 수 있다.


5. 생성자

생성자란 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드이다. 메서드와 유사하지만 리턴값이 없고 클래스의 이름과 생성자의 이름이 다르다는 차이점이 있다.

기본 생성자 

  • 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다. 우리가 생성자 없이 생성할 수 있었던 이유는 컴파일러가 자동적으로 기본 생성자를 추가하기 때문이다.
  • 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

생성자에서 다른 생성자 호출하기

생성자에서 생성자를 왜 호출 해야될까라고 처음에 생각을 했었다. 하지만 입력,상황에 따른 생성자를 나눠주면 효과적일 것이라고 생각이 든다. 

  • 생성자의 이름으로 클래스 이름대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
this 인스턴스 자신을 가르키는 참조변수,인스턴스의 주소가 저장되어 있다. 모든 인스턴스 멧드에 지역변수로 숨겨진 채로 존재한다.
this(),this(매개변수) 생성자,같은 클래스의 다른 생성자를 호출할 때 사용한다.

6. 변수의 초기화

맴버변수와 배열의 초기화는 선택적 이지만 지역변수의 초기화는 필수적이다. 지역변수는 JVM의 스택 영역에 저장되는데 STACK 영역은 재사용이 빈번하다 이는 짧은 시간동안 같은 메모리 공간을 여러 메서드가 사용한다것을 의미하는데 메서드가 호출될 때마다 0으로 초기화 하게 되면 성능이 떨어진다. 

'

맴버 변수의 초기화 방법

  • 명시적 초기화
  • 생성자
  • 초기화 블럭
    • 인스턴스 초기화 블럭
    • 클래스 초기화 블럭

 

명시적 초기화 

 

변수를 선언과 동시에 초기화 하는것을 명시적 초기화라고 한다 가장 기본적이고 간단한 초기화 방법이다.

class Car{

		int door = 4;				//기본형 변수의 초기화
    	Engine e = new Engine();	//참조형 변수의 초기화

}

 

초기화 블럭

 

클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용된다.

인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용된다.

class BlockTest{
	static {
    
    	System.out.println("static {}"); // 클래스 초기화 블럭
    }
    {
    	System.out.println("{}"); 		// 인스턴스 초기화 블럭 
    }
}

 

맴버 변수의 초기화 시기와 순서

클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.

인스턴스변수의 초기화 시점  :인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.

 

클래스 변수의 초기화 순서 : 기본값 - 명시적초기화 - 클래스 초기화 블럭

인스턴스변수의 초기화 순서 : 기본값 - 명시적초기화 - 인스턴스 초기화 블럭