본문으로 바로가기

//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장의 핵심내용

  1. 필드=속성=프로퍼티!
  2. 함수 = 메서드 = 기능 !
  3. 스태틱 : 클래스의 놀이터
  4. 스택 : 메서드의 놀이터
  5. 힙 : 객체의 놀이터

전역변수의 사용을 자제하자.

전역 변수는 코드 어느 곳에서나 접근할 수 있다고 해서 전역변수라고 한다. 그렇다면 왜 전역변수의 사용을 자제해야 하는가?
  1. 프로젝트 규모에 따라 코드가 커지면서 여러 메서드에서 전역 변수의 값을 변경하기 시작하면, T 메모리로 추적하지 않는 이상 전역 변수에 저장돼 있는 값을 파악하기 쉽지 않기 때문이다.
  2. 수천, 수만 줄이 넘는 코드에서 다른 메서드에 의해 전역 변수에 다른 값이 저장된다면 코드를 추적해 들어가야한 그 값과 그 값이 변한 이유를 찾을 수 있다.그 일은 아주 어렵고 힘든 작업이다.단, 예외적으로 일기 전용으로 값을 공유해서 전역 상수로 쓰는 것은 적극 추천한다. ex) Math.PI

3장 자바와 객체 지향

캡! 상추다 ?

  1. 캡슐화(Encapsulation) : 정보 은닉(information hiding)
  2. 상속(inheritance) : 재사용
  3. 추상화(Abstraction) : 모델링
  4. 다형성(Polymorphism): 사용 편의

추상화는 모델링이다

->추상화란 구체적인 것을 분해해서 관찰자(개발자)가 관심 있는 특성만 가지고 재조합하는 것이라고 정리할 수 있다.

상속 : 재사용?

->객체 지향에서의 상속은 상위 클래스의 특성하위 클래스에서 상속(특성 상속)하고, 거기에 더해 필요한 특성을 추가(확장) 하는 것.

  • 하위 클래스 = 상위 클래스
  • 상속은 is a 관계를 만족한다
  • 강아지는 한마리의 동물이다
    ->강이지는 클래스이다. 동물도 클래스이다. 단, '한 마리의 동물' 은 클래스가 아닌 객체이다.
    -> 정확한 표현은 하위 클래스 is a 상위클래스, is a kind of 관계이다.
  • 다중상속을 지원하지 않는다.
  • 다중 상속대신 도입한 인터페이스는 is able to 관계
  • 인터페이스: 구현클래스 is able to 인터페이스(구현클래스는 인터페이스할 수 있다.)
  • 상위 클래스는 하위 클래스에게 물려줄 특성이 풍성할수록 좋다.
  • 인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다.
  • Inheritance 는 객체 지향 언어의 가장 중요하고 강력한 특성임에도 사용하지 말라는 조언까지 나오고 있는 상황이다.(이펙티브 자바 : 18. 상속보다는 컴포지션을 사용하라)

4장 자바가 확장학 객체 지향

abstract(추상)

  1. 추상 클래스는 인스턴스, 즉 객체를 만들 수 없는 클래스가 된다.

-> 오버라이딩을 강제하는 abstract
2. 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.

static 블록 : 현업에서는 거의 사용하지 않는다.

클래스 정보는 해당 클래스가 코드에서 맨 처음 사용될 때 스태틱 영역에 로딩된다.

  • 클래스의 정적 속성을 사용할 때
  • 클래스의 정적 메서드를 사용할 때
  • 클래스의 인스턴스를 최초로 만들 때

이유 : 메모리는 최대한 늦게 사용을 시작하고, 최대한 빨리 반환하는 것이 정석이기때문이다.

final 키워드

final은 마지막, 최종이라는 의미로 자바에서 final 키워드가 나타날 수 있는 곳은 (클래스/변수/메서드)

  1. final과 클래스

->클래스에 final이 붙어있다면 '상속' 을 허용하지 않겠다는 의미. 따라서 하위클래스를 만들 수 없다.

  1. final과 변수
    -> 변수에 final이 붙어있다면 바로 변경 불가능한 상수가 된다.
    -> 정적 상수는 선언시에, 또는 static 블록 내부에서 초기화가 가능하다.
    -> 객체 상수 역시 선언 시 또는 객체 생성자 또는 인스턴스 블록에서 초기화가 가능하다.
  2. final과 메서드
    -> 메서드에 final이 붙으면 재정의, 즉 오버라이딩을 금지한다.

instanceof 연산자

  1. instanceof연산자는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자이다.

->타입은, 객체 참조 변수의 타입이 아닌 실제 객체의 타입에 의해 처리된다.
-> instanceof연산자는 결과로 true 또는 false를 리턴한다.
-> 근데, 이 연산자가 쓰인다면 Dirty 코드 ! 리팩토링이 필요한 코드일 가능성이 높다!

Interface와 implements 키워드

  1. 인터페이스는 public 추상메서드와 public 정적(static) 상수만!
interface exeample{
    double PI = 3.14159;
    final double absoluteZeroPoint = -275.15;

    void sayYes();
}

->위 설명대로라면 위 코드는 인터페이스 조건에 맞지않는 코드라고 생각될 것이다.

  1. 인터페이스는 public 추상메서드
  2. 인터페이스는 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 키워드

  1. 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) 를 접두사로 사용!
  • 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명.정적변수 를 사용!