1. 자식은 부모를 따라야된다 근데 자신을 반환할수도 있다
  2. 배열

공변 , 불변, 반공변

  • 공변 = ( ? extends T )
  • 반공변 = 공변의 반대 ( ? super T )
  • 불변 = 공변과 관계가 없음 ( 하위에서 상위로감 )
  • 메소드를 만드는 사람의 입장에서 다른사람이 이걸 어떻게 사용할지 공변 반공변을 정의해준다.

이펙티브 자바 31장 확인

 

PECS ?

제공하는 사람의 입장, 가져다 쓰는사람의 입장

'개발 > java' 카테고리의 다른 글

TDD 와 리팩토링  (0) 2020.09.07
JVM 구조 복습 - 1  (0) 2020.08.03
enum 사용시 주의할점  (0) 2020.05.13
멤버변수의 초기화 시기와 순서  (0) 2020.04.15

효과적인 리팩토링 , TDD 연습방법.

의식적으로 연습해라 이것에 대한 7가지 원칙

  1. 효과적인 훈련 기법이 수립되어 있는 기술을 연마
  2. 개인의 컴포트 존을 벗어난 지점에서 진행, 자신의 현재 능력을 살짝 넘어가는 작업을 지속적으로 시도
  3. 명확하고 구체적인 목표를 가지고 진행
  4. 신중하고 계획적이다. 즉 개인이 온전히 집중하고 의식적으로 행동할것을 요구
  5. 피드백과 피드백에 따른 행동 변경을 수반해야 한다.
  6. 효과적인 심적 표상을 만들어내는 한편으로 심적 표상에 의존
  7. 기존에 습득한 기술의 특정 부분을 집중적으로 개선함으로써 발전시키고 수정하는 과정을 수반

1단계 - 단위테스트 연습

내가 사용하고 있는 api들을 이용하여 테스트

  • java String class의 다양한 메소드 사용법
  • java ArrayList에 데이터를 추가 수정 삭제하는 방법

효과

  • 단위테스트 방법을 학습할 수 있다.
  • 단위테스트 도구의 사용법을 익힐수 있다.
  • 사용하는 API에 대한 학습효과가 있다.

2단계 - tdd 연습

  • 실제 프로젝트 말고 토이프로젝트에서 연습하자.

  • 웹 모바일 ui나 db에 의존관계를 가지지않는 요구사항으로 연습한다.

  • 리팩토링 시 메소드를 분리를 잘해야 한다.

  • 메소드는 한가지 일만 하게 만든다.

    • 들여쓰기를 1단계만 허용한다.
    • 2단계부터는 메소드로 분리해서 리팩토링
    • else를 쓰지않는다.
  • 로컬 변수가 필요한지도 고민해본다.

  • Compose method 패턴 적용

    • 메소드의 의도가 잘 드러나도록 동등한 수준의 작업을 하는 여러단계로 나눈다.
  • Compose method 패턴으로 동등한 수준의 기능들을 각각의 메소드로 만들어서

  • 한눈에 무슨기능을 하는지 알수있게 하고 그 기능들이 어떻게 구현되는지 보려면

  • 메소드를 보는 방식으로 하고 메소드의 기능을 알려면 모든 코드를

  • 확인할 필요가 없는 장점이 있다.

  • 3개이상의 인스턴스 변수를 사용하지 않는다.

  • 인자의 갯수를 최소한으로 조절

  • 클래스도 가능한 작게 만들어라

영상

https://www.youtube.com/watch?v=cVxqrGHxutU&ab_channel=OKKY

문서

https://www.slideshare.net/OKJSP/okkycon-tdd

'개발 > java' 카테고리의 다른 글

공변 불변 반공변  (0) 2021.04.26
JVM 구조 복습 - 1  (0) 2020.08.03
enum 사용시 주의할점  (0) 2020.05.13
멤버변수의 초기화 시기와 순서  (0) 2020.04.15

1. 클래스 로더 시스템

  • 컴파일 되어있는 클래스 파일 같은것들을 읽어서 메모리에 적절하게 배치시킴
  • 로딩 , 링크 , 초기화 순으로 진행된다.

A. 로딩

  • 3가지 종류가 계층형으로 존재함.

  • (최상위 계층) Bootstrap 클래스로더 , 네이티브로 구현됨

  • 플랫폼 클래스로더

  • 애플리케이션 클래스로더

  • 애플리케이션 클래스로더에서 class 파일을 읽으라는 요청을 받을시 최상위부터 읽을 수 있는지 체크하고

  • 읽을 수 있으면 작동 모두 못읽으면 ClassNotFoundException 에러남.

  • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고

  • 메소드 영역에 저장

  • 메소드 영역에 저장하는 데이터는

  • FQCN ( 패키지 경로까지 포함한 클래스 이름)

  • 클래스 , 인터페이스 , ENUM

  • 메소드 , 변수

  • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장.

B. 링크

  • 레퍼런스를 연결

  • 링크는 3가지로 나뉨 Verify , Perpare , Resolve (optional)

  • Verfiy 는 .class파일의 형식이 유효한지 체크한다.

  • Perpare 는 클래스 변수 (static 변수) 와 기본값에 필요한 메모리를 준비해두는 과정

  • Resolve 는 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.

C. 초기화

  • Class의 Static 한 값들을 초기화 시킴
  • B.링크에서 Prepare 단계에서 준비시켜둔 메모리에 Class의 Static 변수 와 블럭을 할당함

2. 메모리

  • 스택 , PC , 네이티브 메소드 스택 , 힙 , 메소드 영역으로 나뉘어져 있음

A. 스택

  • 각 쓰레드 마다 런타임 스택을 만들고 그 안에 메소드 호출을 스택 프레임(메소드 콜)이라 부르는 블럭으로 쌓는다.

  • 에러 메세지에 콜 스택들을 보면 메세지 호출 스택을 볼수 있다.

  • 쓰레드 종료시 런타임 스택도 사라진다.

B. Program Counter Registers

  • 스택에서 각 쓰레드마다 런타임 스택을 만들고 메소드 호출을 스택 프레임에 쌓을때
  • 쓰레드에서 현재 실행할 스택 프레임을 가리키는 포인터가 생성된다.

C. 네이티브 메소드 스택

  • 쓰레드 마다 생성

  • 네이티브 메소드를 호출 할 때 네이티브 메소드의 매개변수 지역변수 등을 저장

  • 네이티브 메소드 라이브러리를 사용하려면 네이티브 메소드 인터페이스를 통해야 함

  • JNI를 사용하는 스택은 네이티브 메소드 스택에 저장됨

  • JNI는 java native interface 로 native 키워드가 붙어있으며

  • java로 구현된게 아닌 C나 C++로 구현된것.

D. 힙

  • 객체(인스턴스들)를 저장하고 공유하는 영역
  • Young Generation , Old Generation , Permanent Generation 이 존재

E. 메소드 영역

  • 클래스 수준의 정보 ( 클래스 의 이름 , 부모 클래스의 이름 , 메소드 , 변수 ) 가 저장되고 공유하는 영역

3. 실행 엔진

  • Byte 코드들을 한줄씩 읽어들여서 머신이 이해할수 있는 native 코드로 바꿔줌.
  • 머신이 이해하면서 실행함.
  • 한줄마다 byte code를 native code로 컴파일

A. 인터프리터

  • 바이트 코드를 한줄씩 읽어들임

B. Jit Compiler

  • Just In Time Compiler

  • 인터프리터가 읽어들이면서 반복 되는 코드를 발견하면

  • jit 컴파일러가 반복되는 코드를 모두 네이티브 코드로 바꿔둔다.

  • 그다음부터는 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.

  • 인터프리터 효율이 높아짐.

C. Garbage Collector

  • 더이상 참조되지 않는 객체를 모아서 정리한다.
  • Throughput collector 과 stop the world collect가 있다.
  • 우리는 서버 운영중 수많은 객체를 생성하고 response time이 중요하므로
  • 이런 경우는 stop the world 를 사용.

 

 

 

 

참고

Java 코드를 조작하는 다양한 방법 - 백기선

'개발 > java' 카테고리의 다른 글

공변 불변 반공변  (0) 2021.04.26
TDD 와 리팩토링  (0) 2020.09.07
enum 사용시 주의할점  (0) 2020.05.13
멤버변수의 초기화 시기와 순서  (0) 2020.04.15

enum은 올디널 타입과 스트링 타입 2가지가 있다.

올디널 타입은 enum 값에 번호를 매겨서 번호로 지정하는 방식이고

스트링 타입은 문자열로 지정하는 방식이다.

 

올디널 타입 사용시 혹시 누군가가 enum 클래스에 새로운 값을 추가한다면

번호가 변경되므로 소스에 치명적이다.

 

하지만 스트링 타입을 사용하면 직접호출하는것이기 때문에 문제가 없다.

 

default는 ordinal 이므로 string으로 선언해 주도록 한다

'개발 > java' 카테고리의 다른 글

공변 불변 반공변  (0) 2021.04.26
TDD 와 리팩토링  (0) 2020.09.07
JVM 구조 복습 - 1  (0) 2020.08.03
멤버변수의 초기화 시기와 순서  (0) 2020.04.15

 

클래스 변수의 초기화 시점
    * 클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.
    * 인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.

클래스 변수의 초기화 순서
    * 클래스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭
    * 인스턴스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자

'개발 > java' 카테고리의 다른 글

공변 불변 반공변  (0) 2021.04.26
TDD 와 리팩토링  (0) 2020.09.07
JVM 구조 복습 - 1  (0) 2020.08.03
enum 사용시 주의할점  (0) 2020.05.13

+ Recent posts