갓태희

[Effective Java] 들어가기 본문

Effective Java

[Effective Java] 들어가기

갓태희 2021. 5. 22. 20:07

✅ 들어가기

  • 이 책의 규칙 대부분은 명료성과 단순성이라는 아주 핵심적인 기본 원칙에서 파생된다.
  • 컴포넌트는 가능한 작되, 그렇다고 너무 작아서는 안된다.
    • 이 책에서 컴포넌트란 개별 메서드부터 여러 패키지로 이뤄진 복잡한 프레임워크 까지 재사용 가능한 모든 소프트웨어 요소를 뜻한다.
  • 코드는 복사되는게 아니라 재사용 되어야한다 (그냥 막 복붙해서 될게아니다 라는뜻인거같다.)
  • 오류는 만들어지자마자 가능한 한 빨리 (되도록 컴파일 타임에) 잡아야 한다.
    • 컴파일 타임에 오류가 난다는것은 보통 문법이 틀리거나 타입이 다를때 실행(Run)하기 전에 빨간 줄로 뜨는 에러를 말하는데 런타임(실제 Run)후에 나타나는 오류(0으로 나누는)가 일어나기 전에 가능한 한 빨리 오류를 잡아야한다는 말이다.
  • 자바가 지원하는 타입은 인터페이스, 클래스, 배열, 기본타입 이렇게 총 4개가 있는데 annotation은 인터페이스의 일종이며 열거 타입(enum)은 클래스의 일종이다.
  • 그중 인터페이스, 클래스, 배열은 참조타입(reference type)이라고 한다. 즉, 클래스의 인스턴스와 배열은 객체(object)인 반면, 기본 타입(int, float, char)값은 그렇지 않다. 여기서 String은 기본타입이 아니라 사실 클래스이다.
  • 클래스의 멤버로는 필드(field), 메서드(method), 멤버 클래스, 멤버 인터페이스가 있다.
  • 메서드 시그니처는 메서드 이름과 입력 매개변수(parameter)의 타입들로 이뤄진다. 
    • 이때 반환값의 타입은 메서드 시그니처에 포함되지 않는다.

 

✔  메서드 시그니처란?

Java 메서드의 정의에서 메서드 이름과 매개변수 리스트의 조합을 말한다

 

즉, 메서드 시그니처 = 메서드 이름 + 매개변수 리스트

 

이것이 따로 불리는 이유는 오버로딩 때문인데 자바 컴파일러가 메서드 시그니처를 통해 메서드 간의 차이를 식별하기 때문이다.

 

public void funcA(int x, int y) {
	... // Method Signature : funcA, int x, int y
}

public void funcA(double x, int y, double z) {
	... // Method Signature: funcA, int x, int y, double z
}

위의 코드에서 funcA로 메서드의 이름은 같지만 그 매개변수는 다르므로 두 함수의 메서드 시그니처는 다르기때문에

 

이 정보를 토대로 자바 컴파일러는 오버로딩된 메서드를 구분할수 있다.

 

이 책은 상속서브클래싱이라고 하며

인터페이스 상속 대신 클래스가 인터페이스를 구현한다 혹은 인터페이스가 다른 인터페이스를 확장한다 라고 한다.

 

아무것도 명시하지 않은 접근수준(access level)을 이야기 할때는 기술적으로 정확한 이름인 패키지 접근(package access)대신 전통적인 패키지-프라이빗(package-private)를 사용한다.

 

✔ 접근수준(access level)

자바의 access level은 public, protected, (package-private), private 로 4개가 있다.

 

그중에 (package-private)을 이 책에서 사용하겠다는건데 아래 예제를 보자.

 

package test;

public class AccessModifier {

	// public
	public void publicMethod() {
		System.out.println("publicMethod() is called");
	}
    
	// protected
	protected void protectedMethod() {
		System.out.println("protectedMethod() is called");
	}
	
        // package-private
	void packagePrivateMethod() {
		System.out.println("packagePrivateMethod() is called");
	}
	
        // private
	private void privateMethod() {
		System.out.println("privateMethod() is called");
	}
    
}

 

package-private 를 제외한 나머지 access level은 함수의 반환타입 앞에 명시적으로 적어주었는데

 

package-private는 access level을 적어주지않는것을 말한다.

 

적어주지않는다는 말은 access level이 없다는 말은 아니며, 해당클래스와 같은 패키지 안에서 접근이 가능한 제어자 이다.

 

 

✅  API

API(Application Programming Interface)는 프로그래머가 클래스, 인터페이스, 패키지를 통해 접근할 수 있는 모든  클래스, 인터페이스, 생성자, 멤버, 직렬화된 형태(serialized form)을 말한다.

 

API를 사용하는 프로그램 작성자(사람)은 그 API의 사용자(user)라고 하고, API를 사용하는 클래스(코드)는 그 API의 클라이언트(client)라고 한ㄴ다.

 

클래스, 인터페이스, 생성자, 멤버, 직렬화된 형태를 총칭해 API요소(API Element)라고 한다.

 

공개 API란 그 API를 정의한 패키지의 밖에서 접근할 수 있는 API요소로 이뤄진다. 다시 말해 모든 클라이언트(코드)가 접근할 수 있고, API 작성자가 지원하기로 약속한 API 요소들이다.

 

✔  직렬화된 형태 (Serialized form)

Serialization is a mechanism of converting the state of an object into a byte stream.

이를 해석해 보면 직렬화는 byte tream으로 객체의 상태를 변환하는 메커니즘이라고 할수있는데

 

이때 byte stream이란 데이터를 Byte단위로 주고받는 것을 말하는데, 대표적으로 자바에서의 Byte Stream은 InputStreamOutputStream이 있다. 이 클래스를 통과하는 단위는 당연히 Byte로 이루어져 있다.

 

그림, 텍스트, zip, jar 등과 같은 모든 데이터는 원래 Byte로 되어있다. 이 Byte들을 적절하게 변환하면 데이터가 되는 것이며 Byte Stream을 사용하는것은 원시 Byte를 그대로 주고 받겠다는 의미가 담겨져 있다.

 

 

✅ 참고

메서드 시그니처

serialization

Byte Stream

RunTime and CompileTime

 

Comments