자바 프로그램이 실행되기 위해선 다음과 같은 과정을 거친다. 인텔리제이 같은 editor로 자바 소스 코드를 작성한다. (Simple.java 작성) 프로그램을 컴파일러(javac)가 바이트코드로 컴파일한다. (Simple.class 파일 생성) JVM의 실행 엔진이 바이트코드를 기계어로 변환시켜 실행한다. 실행 엔진이 필요한 클래스를 요청하면 클래스 로더가 클래스를 로드한다. (동적 로딩) JVM이란 JAVA Virtual Machine은 자바 바이트코드를 실행하는 가상 머신이다. 이 바이트코드는 .java 파일을 컴파일한. class파일로부터 얻을 수 있다. JVM은 운영 체제에 의존하지 않는 인터페이스를 제공하기 때문에 가상이라고 한다. 이러한 OS 및 하드웨어로부터의 독립성은 java 프로그램의 ..
분류 전체보기
IllegalArgumentException vs IllegalStateException @Override public State proceed(Command command) { if (command.isMove()) { throw new IllegalArgumentException(CANNOT_MOVE); } if (command.isStatus()) { throw new IllegalStateException(CANNOT_GENERATE_SCORE); } // ... } IllegalArgumentException과 IllegalStateException을 혼용하여 사용하고 있었고 리뷰어가 이를 지적했다. 각 기능을 만들 때 이 두 예외를 언제 써야 하는지 정확한 기준을 잡지 못했던 것이다. 다음 글..
테스트 더블 테스트 더블이란 실제 프로덕션 코드에서 쓰이지 않는 객체를 사용해 테스트를 진행하는 것을 의미한다. 애플리케이션을 개발할 때 테스트 코드도 프로덕션 코드 못지않게 중요하다. 그 중요한 테스트 코드를 왜 실제 객체가 아닌 다른 객체로 테스트를 하는 것일까? 다른 이유도 있겠지만 다음의 두 가지 이유가 중요하다고 생각한다. 1. 테스트 하려는 객체와 연관된 객체가 사용하기 어려운 경우 2. 테스트 하려는 객체와 연관된 객체의 상태에 상관없이 테스트하고자 하는 객체만 테스트하고 싶은 경우 어찌보면 비슷한 말이다. 즉 연관된 객체와 테스트하고자 하는 객체를 분리하고 싶은 것이다. 연관된 객체에 문제가 생기더라도 테스트하고자 하는 객체의 테스트는 통과할 수 있어야 옳게 된 단위 테스트이다. (물론 연..
디폴트 메서드 전통적인 자바 인터페이스를 구현하는 클래스는 인터페이스의 모든 메서드 구현을 제공하거나 슈퍼 클래스의 구현을 상속받아야 한다. 인터페이스를 바꾸고 싶을 때 문제 발생 -> 모든 구현체를 다 고쳐야 함 자바 8 인터페이스의 변화 인터페이스 내부에 정적 메서드 사용 디폴트 메서드 기능 사용 즉 메서드 구현을 포함한 인터페이스를 정의할 수 있다. 기존 코드 구현을 바꾸지 않도록 하면서 인터페이스를 바꿀 수 있다. 결국 추상 클래스? 디폴트 메서드는 주로 라이브러리 설계자들이 사용한다. 정적 메서드와 인터페이스 보통 자바에서는 인터페이스와 인터페이스를 활용할 수 있는 정적 메서드를 정의하는 유틸리티 클래스를 활용한다. (Collection 인터페이스를 활용하는 Collections) 자바 8 이후..
상태 패턴을 위키 백과에선 다음과 같이 정의하고 있다. 상태 패턴(state pattern)은 객체 지향 방식으로 상태 기계를 구현하는 행위, 소프트웨어 디자인 패턴이다. 상태 패턴을 이용하면 상태 패턴 인터페이스의 파생 클래스로서 각각의 상태를 구현함으로써, 또 패턴의 슈퍼클래스에 의해 정의되는 메소드를 호출하여 상태 변화를 구현함으로써 상태 기계를 구현한다. 상태 패턴은 패턴의 인터페이스에 정의된 메소드들의 호출을 통해 현재의 전략을 전환할 수 있는 전략 패턴으로 해석할 수 있다. 쉽게 말해서 여러 조건에 분기 되는 로직을 if 문으로 해결하는 것이 아니라 객체의 다형성을 사용해 해결하는 방법이다. 우아한테크코스 체스 미션을 진행하면서 체스 게임이 진행되는 상태를 상태 패턴으로 구현했다. 체스 미션의..
IllegalArgumentException 가장 많이 사용되는 예외 중 하나로 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외이다. 예를 들어 정수 파라미터를 받고 양수만 들어와야 한다고 할 때 음수가 들어오면 사용할 수 있다. public void onlyPlus(int number) { if (number
최상단 directory 하위에 docker directory를 생성 하위에 docker-compose.yml 파일 생성 version: "3.9" services: db: image: mysql:8.0.28 platform: linux/x86_64 restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: practice MYSQL_USER: user MYSQL_PASSWORD: password TZ: Asia/Seoul volumes: - ./db/mysql/data:/var/lib/mysql - ./db/mysql/config:/etc/mysql/conf.d - ./db/mysql/init:/d..
열거 타입의 확장은 불가능? 열거 타입은 활용하기 좋지만 확장할 수 없다는 단점이 있다. 쉽게 말해서 Enum 타입은 상속이 불가능하다. 사실 대부분의 상황에서 열거 타입을 확장하는 것은 좋지 않은 생각이다. 열거 타입은 원소들을 순회할 수 있는데 기반 타입과 확장 타입을 모두 순회하는 방법도 마땅치 않다. 열거 타입은 인터페이스를 구현할 수 있다. 열거 타입을 상속받는 것은 불가능하다. 하지만 열거 타입이 인터페이스를 구현하는 것은 가능하다. 상위 인터페이스를 정의하고 이를 확장한 여러 열거 타입으로 유연하게 여러 열거 타입 구현체를 사용할 수 있다. 아래는 체스 미션에서 사용한 인터페이스와 열거 타입을 사용한 예시이다. 체스 미션에서 활용한 방향 열거 타입 체스 기물인 킹, 퀸, 폰, 룩, 비숍, 나..