일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- git push
- hash-object
- Server Off
- Spring
- 리눅스
- docker daemon
- commit
- Dependency
- brew
- Modified
- npm
- spring boot
- unmodified
- git
- maven
- SpringBootApplication
- github
- node
- git rm --cached
- 자바스크립트
- staged
- Auto-Importing
- Dependency Management
- docker
- JS
- git rm
- node.js
- Git내부
- Linux
- Git 내부
- Today
- Total
갓태희
[Effective Java] 들어가기 본문
✅ 들어가기
- 이 책의 규칙 대부분은 명료성과 단순성이라는 아주 핵심적인 기본 원칙에서 파생된다.
- 컴포넌트는 가능한 작되, 그렇다고 너무 작아서는 안된다.
- 이 책에서 컴포넌트란 개별 메서드부터 여러 패키지로 이뤄진 복잡한 프레임워크 까지 재사용 가능한 모든 소프트웨어 요소를 뜻한다.
- 코드는 복사되는게 아니라 재사용 되어야한다 (그냥 막 복붙해서 될게아니다 라는뜻인거같다.)
- 오류는 만들어지자마자 가능한 한 빨리 (되도록 컴파일 타임에) 잡아야 한다.
- 컴파일 타임에 오류가 난다는것은 보통 문법이 틀리거나 타입이 다를때 실행(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은 InputStream과 OutputStream이 있다. 이 클래스를 통과하는 단위는 당연히 Byte로 이루어져 있다.
그림, 텍스트, zip, jar 등과 같은 모든 데이터는 원래 Byte로 되어있다. 이 Byte들을 적절하게 변환하면 데이터가 되는 것이며 Byte Stream을 사용하는것은 원시 Byte를 그대로 주고 받겠다는 의미가 담겨져 있다.
✅ 참고