//2020.07.06(월)
JDK, JRE, JVM의 관계
- JDK : Java Development Kit /자바 개발 도구
- JDK는 자바 소스 컴파일러인 Javac.exe를 포함한다.
- JRE : Java Runtime Environment / 자바 실행 환경
-JRE는 자바 프로그램 실행기인 java.exe를 포함한다. - JVM : Java Virtual Machine / 자바 가상 기계
- 본인이 사용 중인 플랫폼(window/MAC 등)에 설치된 JVM용으로 프로그램을 작성하고 배포하면 각 플랫폼에 맞는 JVM이 중재자로서 각 플랫폼에서 프로그램을 구동하는데 아무 문제가 없게끔 만들어준다.
- 자바가 이런 구조를 택한 이유는 기존 언어로 작성된 프로그램이 각 플랫폼용으로 배포되는 설치파일을 따로 준비해야 했던 불편함을 없애기 위함이다.
2장의 핵심내용
- 필드=속성=프로퍼티!
- 함수 = 메서드 = 기능 !
- 스태틱 : 클래스의 놀이터
- 스택 : 메서드의 놀이터
- 힙 : 객체의 놀이터
전역변수의 사용을 자제하자.
전역 변수는 코드 어느 곳에서나 접근할 수 있다고 해서 전역변수라고 한다. 그렇다면 왜 전역변수의 사용을 자제해야 하는가?
- 프로젝트 규모에 따라 코드가 커지면서 여러 메서드에서 전역 변수의 값을 변경하기 시작하면, T 메모리로 추적하지 않는 이상 전역 변수에 저장돼 있는 값을 파악하기 쉽지 않기 때문이다.
- 수천, 수만 줄이 넘는 코드에서 다른 메서드에 의해 전역 변수에 다른 값이 저장된다면 코드를 추적해 들어가야한 그 값과 그 값이 변한 이유를 찾을 수 있다.
그 일은 아주 어렵고 힘든 작업이다.단, 예외적으로 일기 전용으로 값을 공유해서 전역 상수로 쓰는 것은 적극 추천한다. ex) Math.PI
3장 자바와 객체 지향
캡! 상추다 ?
- 캡슐화(Encapsulation) : 정보 은닉(information hiding)
상속(inheritance) : 재사용- 추상화(Abstraction) : 모델링
- 다형성(Polymorphism): 사용 편의
추상화는 모델링이다
->추상화란 구체적인 것을 분해해서 관찰자(개발자)가 관심 있는 특성만 가지고 재조합하는 것이라고 정리할 수 있다.
상속 : 재사용?
->객체 지향에서의 상속은 상위 클래스의 특성을 하위 클래스에서 상속(특성 상속)하고, 거기에 더해 필요한 특성을 추가(확장) 하는 것.
- 하위 클래스 = 상위 클래스
- 상속은 is a 관계를 만족한다
- 강아지는 한마리의 동물이다
->강이지는 클래스이다. 동물도 클래스이다. 단, '한 마리의 동물' 은 클래스가 아닌 객체이다.
-> 정확한 표현은 하위 클래스 is a 상위클래스, is a kind of 관계이다. - 다중상속을 지원하지 않는다.
- 다중 상속대신 도입한 인터페이스는 is able to 관계
- 인터페이스: 구현클래스 is able to 인터페이스(구현클래스는 인터페이스할 수 있다.)
- 상위 클래스는 하위 클래스에게 물려줄 특성이 풍성할수록 좋다.
- 인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다.
- Inheritance 는 객체 지향 언어의 가장 중요하고 강력한 특성임에도 사용하지 말라는 조언까지 나오고 있는 상황이다.(이펙티브 자바 : 18. 상속보다는 컴포지션을 사용하라)
4장 자바가 확장학 객체 지향
abstract(추상)
- 추상 클래스는 인스턴스, 즉 객체를 만들 수 없는 클래스가 된다.
-> 오버라이딩을 강제하는 abstract
2. 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.
static 블록 : 현업에서는 거의 사용하지 않는다.
클래스 정보는 해당 클래스가 코드에서 맨 처음 사용될 때 스태틱 영역에 로딩된다.
- 클래스의 정적 속성을 사용할 때
- 클래스의 정적 메서드를 사용할 때
- 클래스의 인스턴스를 최초로 만들 때
이유 : 메모리는 최대한 늦게 사용을 시작하고, 최대한 빨리 반환하는 것이 정석이기때문이다.
final 키워드
final은 마지막, 최종이라는 의미로 자바에서 final 키워드가 나타날 수 있는 곳은 (클래스/변수/메서드)
- final과 클래스
->클래스에 final이 붙어있다면 '상속' 을 허용하지 않겠다는 의미. 따라서 하위클래스를 만들 수 없다.
- final과 변수
-> 변수에 final이 붙어있다면 바로 변경 불가능한 상수가 된다.
-> 정적 상수는 선언시에, 또는 static 블록 내부에서 초기화가 가능하다.
-> 객체 상수 역시 선언 시 또는 객체 생성자 또는 인스턴스 블록에서 초기화가 가능하다. - final과 메서드
-> 메서드에 final이 붙으면 재정의, 즉 오버라이딩을 금지한다.
instanceof 연산자
- instanceof연산자는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자이다.
->타입은, 객체 참조 변수의 타입이 아닌 실제 객체의 타입에 의해 처리된다.
-> instanceof연산자는 결과로 true 또는 false를 리턴한다.
-> 근데, 이 연산자가 쓰인다면 Dirty 코드 ! 리팩토링이 필요한 코드일 가능성이 높다!
Interface와 implements 키워드
- 인터페이스는 public 추상메서드와 public 정적(static) 상수만!
interface exeample{
double PI = 3.14159;
final double absoluteZeroPoint = -275.15;
void sayYes();
}
->위 설명대로라면 위 코드는 인터페이스 조건에 맞지않는 코드라고 생각될 것이다.
- 인터페이스는 public 추상메서드
- 인터페이스는 public정적 상수
두 조건이 모두 성립되지 않아보일수도 있지만, interface는 위 두개의 조건만 가능하기때문에 java가 자동으로
public과 abstract, static, final을 알아서 붙여준다.
즉, 아래의 코드와 완전히 동등한 코드이다.
interface exeample{
public static final double PI = 3.14159;
public static final double absoluteZeroPoint = -275.15;
public abstract void sayYes();
}
인터페이스의 메서드는 추상메서드이기때문에 메서드의 몸체가 존재하지 않는다. (오버라이딩이 강제된다.)
단, 자바8부터는 인터페이스에 [디폴트 메서드 : 객체 구상 메서드] 와 [정척 추상 메서드] 를 지원할 수 있게 언어 스펙이 바뀌었다.
this 키워드
- this는 객체가 자기 자신을 지칭할 때 쓰는 키워드로, 마치 일상생활에서 "나!" 라고 하는 대명사와 같다.
아래 코드로 쉽게 이해해보자.
class 악어 {
int var= 10;
void test() {
int var = 20;
System.out.println(var);
System.out.println(this.var);
위 코드를 보면 var라는 이름의 변수명이 지역 변수와 객체 변수 두 곳에서 사용하고 있다.
지역변수는 test() 메서드 내부에있는 변수(20)이고, 객체변수는 악어라는 클래스가 가지고 있는 변수(10) 이다.
- 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 동일하다면 지역변수가 우선 !
- 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this 키워드 (this.var) 를 접두사로 사용!
- 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명.정적변수 를 사용!
'개발 서적 정리' 카테고리의 다른 글
[Modern Java in Action] null 대신 Optional을 사용하기 (0) | 2020.08.02 |
---|---|
[Modern Java in Action] Stream 2편 (0) | 2020.07.30 |
[Modern Java in Action] 함수형 인터페이스 (0) | 2020.07.25 |
[Java8] .map() vs .flatMap() 차이점 알아보기 (0) | 2020.07.24 |
[Modern Java in Action] Stream (0) | 2020.07.13 |