자바 프로그램이 실행되기 위해선 다음과 같은 과정을 거친다. 인텔리제이 같은 editor로 자바 소스 코드를 작성한다. (Simple.java 작성) 프로그램을 컴파일러(javac)가 바이트코드로 컴파일한다. (Simple.class 파일 생성) JVM의 실행 엔진이 바이트코드를 기계어로 변환시켜 실행한다. 실행 엔진이 필요한 클래스를 요청하면 클래스 로더가 클래스를 로드한다. (동적 로딩) JVM이란 JAVA Virtual Machine은 자바 바이트코드를 실행하는 가상 머신이다. 이 바이트코드는 .java 파일을 컴파일한. class파일로부터 얻을 수 있다. JVM은 운영 체제에 의존하지 않는 인터페이스를 제공하기 때문에 가상이라고 한다. 이러한 OS 및 하드웨어로부터의 독립성은 java 프로그램의 ..
JAVA
테스트 더블 테스트 더블이란 실제 프로덕션 코드에서 쓰이지 않는 객체를 사용해 테스트를 진행하는 것을 의미한다. 애플리케이션을 개발할 때 테스트 코드도 프로덕션 코드 못지않게 중요하다. 그 중요한 테스트 코드를 왜 실제 객체가 아닌 다른 객체로 테스트를 하는 것일까? 다른 이유도 있겠지만 다음의 두 가지 이유가 중요하다고 생각한다. 1. 테스트 하려는 객체와 연관된 객체가 사용하기 어려운 경우 2. 테스트 하려는 객체와 연관된 객체의 상태에 상관없이 테스트하고자 하는 객체만 테스트하고 싶은 경우 어찌보면 비슷한 말이다. 즉 연관된 객체와 테스트하고자 하는 객체를 분리하고 싶은 것이다. 연관된 객체에 문제가 생기더라도 테스트하고자 하는 객체의 테스트는 통과할 수 있어야 옳게 된 단위 테스트이다. (물론 연..
상태 패턴을 위키 백과에선 다음과 같이 정의하고 있다. 상태 패턴(state pattern)은 객체 지향 방식으로 상태 기계를 구현하는 행위, 소프트웨어 디자인 패턴이다. 상태 패턴을 이용하면 상태 패턴 인터페이스의 파생 클래스로서 각각의 상태를 구현함으로써, 또 패턴의 슈퍼클래스에 의해 정의되는 메소드를 호출하여 상태 변화를 구현함으로써 상태 기계를 구현한다. 상태 패턴은 패턴의 인터페이스에 정의된 메소드들의 호출을 통해 현재의 전략을 전환할 수 있는 전략 패턴으로 해석할 수 있다. 쉽게 말해서 여러 조건에 분기 되는 로직을 if 문으로 해결하는 것이 아니라 객체의 다형성을 사용해 해결하는 방법이다. 우아한테크코스 체스 미션을 진행하면서 체스 게임이 진행되는 상태를 상태 패턴으로 구현했다. 체스 미션의..
IllegalArgumentException 가장 많이 사용되는 예외 중 하나로 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외이다. 예를 들어 정수 파라미터를 받고 양수만 들어와야 한다고 할 때 음수가 들어오면 사용할 수 있다. public void onlyPlus(int number) { if (number
자바의 Enum은 다양한 일을 할 수 있다. 예전 포스팅에서도 설명했지만 Enum은 당수 상수 모음이 아니라 고차원의 추상 개념을 완벽히 표현할 수 있을 뿐 아니라 각 상수 데이터와 연결 지어 다양한 일을 할 수 있다. 여러분은 Enum을 사용해 if문을 제거할 수 있나요? 예전에 수업에서 코치가 한 말이다. 당시에는 무슨 의미인지 정확히 몰랐지만 미션을 진행하다 아 이렇게 if 분기문을 없앨 수 있구나 깨달은 적이 있었다. 오늘은 우아한테크코스 블랙잭 미션에서 Enum을 어떻게 활용했는지 포스팅하고자 한다. 블랙잭 결과 도출 규칙 딜러와 플레이어가 대결해서 카드패의 숫자 합이 21을 넘지 않으면서 높으면 승리하는 게임 승리 조건 블랙잭 : 처음 받은 2장의 카드가 21이면 블랙잭이라고 한다. 블랙잭일 ..
위키백과에 의하면 옵저버 패턴의 정의는 다음과 같다. 옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 좀 더 풀어서 말하면 어떤 이벤트가 발생했을 때 주제(Subject)라 불리는 객체가 다른 객체 리스트(옵저버)에 자동으로 알림을 보내야 하는 상황에서 사용한다. 예를 들어서 자신이 구독한 유튜브 채널에서 영상이 올라오면 구독자들에게 알림이 오는데 이런 상황에서 옵저버 패턴을 사용한다. 구독자(옵저버)들이 유튜버(주제 객체)를 관찰하고 있는 것이다. 옵저버 패턴 구조 Observer : 데이터의 변경을 통보받는 인터페이스..
우아한테크코스 로또 미션을 진행하던 중 두 리스트를 비교하여 테스트할 일이 있었다. @Test @DisplayName("수동 로또 번호 생성 검증") void createLottoTicketsByManual() { List lottoNumbers = List.of(List.of(1, 2, 3, 4, 5, 6), List.of(7, 8, 9, 10, 11, 12)); List lottoTickets = lottoMachine.purchaseLottoTicketsByManual(lottoNumbers); Iterator iterator = lottoNumbers.iterator(); for (LottoTicket lottoTicket : lottoTickets) { List ticketNumbers = lo..
프로그래밍을 하다 보면 컬렉션, 그중에서도 List를 참 많이 다루게 된다. 특히 리스트 안의 데이터가 비즈니스 로직적으로 중요해서 일급 컬렉션으로 다루는 경우 신경 써서 리스트 안의 데이터를 관리해야 한다. 일급 컬렉션 안에 데이터를 조회해야할 일이 생기는 경우 원본 데이터를 아래와 같이 바로 리턴하면 데이터를 보호할 수가 없다. public class MemberRepository { private final List members = new ArrayList(); public List getMembers() { return members; } } getMembers()를 호출한 클라이언트 쪽에서 리스트에 데이터를 변경하면 잘못된 정보가 전달돼버리고 만다. 그래서 원본이 아닌 복사 데이터를 넘겨줄 필..