자동차 경주 미션 하나의 객체가 많은 책임을 맡지 않도록 하자 public class InputView { // ... private static final Scanner scanner = new Scanner(System.in); public static List getCarNames() { System.out.println(CAR_NAMES_MESSAGE); return Converter.toCarList(scanner.next()); } // ... } 사용자에게 입력을 받는 InputView 클래스이다. 자동차의 이름을 입력받아 Converter 클래스를 통해 Car 객체의 리스트를 반환하는 메서드를 가지고 있다. 그리고 Converter 클래스 안에는 자동차 이름에 대한 검증 로직이 Valida..
전체 글
중첩 클래스 중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 메서드 밖에서 사용해야 하거나 메서드 안에 정의하기에 너무 길 때 만든다. public class OuterClass { // ... class InnerClass { // ... } } 정적 멤버 클래스 static이 붙어 정적으로 선언된 중첩 클래스를 정적 멤버 클래스라고 한다. 바깥 클래스의 private 멤버 변수에도 접근할 수 있다는 점만 제외하고 일반 클래스와 똑같다. 멤버 클래스일 뿐 다른 정적 멤버 변수와 같은 규칙을 적용받는다. 바깥 클래스가 생성되는 것과 상관없이 독립적으로 생성할 수 있다. public class OuterClass { static class StaticInnerClass {..
일반적으로 객체를 생성할 때 생성자를 통해 생성한다. CustomClass customClass = new CustomClass(); 정적 팩터리 메서드는 객체를 생성할 때 클래스 내부에 구현된 클래스 메서드로 자기 자신 객체를 반환하는 메서드이다. LocalDateTime을 예시로 살펴보자. LocalDateTime localDateTime = LocalDateTime.of(2022, 2, 24, 10, 26); 이처럼 객체를 생성할 때 of와 같은 이름을 가진 메서드로 클래스 메서드로 객체를 생성하는 것을 정적 팩터리 메서드라고 한다. 정적 팩터리 메서드를 사용하면 얻을 수 있는 이점은 다음과 같다. 1. 이름을 가질 수 있다. 단순히 매개변수나 생성자 자체만으로 반환된다면 객체의 특성을 제대로 설명..
자바를 컴퓨터가 알아듣기까지 컴파일 인간이 이해하기 쉬운 언어를 기계어로 번역하는 과정 자바 코드를 바이트 코드(=바이너리 코드) 변환해서 컴퓨터가 이해할 수 있도록 변환 System.out.println(“HelloWorld”) -> 01010100110100-> 컴퓨터가 이해 컴파일러 컴파일 하는 프로그램 바이트 코드 0과 1로 이루어진 코드, 컴퓨터가 이해할 수 있다. 0과 1의 조합은 OS마다 다르다. (윈도우, 맥, 리눅스) 운영체제마다 “Hello World”가 실행 안될 수도 있다. 그래서 C언어 같은 경우 각각 다른 컴파일러가 필요하다. JVM 자바 컴파일러가 하나 있고 각 OS로 바로 가는 것이 아니라 JVM을 거쳐서 간다. (각 OS와 호환시켜 주는 아이) 자바 가상 머신의 약자 (Ja..
스트림(Stream)이란 스트림은 자바8부터 추가된 기능으로 컬렉션이나 배열의 값을 하나씩 참조, 처리할 수 있게 해주는 반복자이다. 람다식을 사용해 간결하고 가독성 좋은 반복를 할 수 있고 둘 이상의 작업을 동시에 진행하는 병렬 처리가 가능하다는 장점도 있다. 예시를 살펴 보자. 1부터 10까지의 int 리스트에서 짝수만 골라서 가져와야 한다고 해보자. 일반 반복문 public static List notStream(List numbers) { List evenNumbers = new ArrayList(); for (Integer number : numbers) { if (number % 2 == 0) { evenNumbers.add(number); } } return evenNumbers; } 짝수를..
Git을 사용하여 커밋을 하다 보면 커밋 내역이 차곡차곡 쌓인다. 그런데 코딩을 하다 보면 커밋 기록을 취소하거나 과거로 돌아가야 할 일이 생긴다. 이때 사용할 수 있는 명령어가 바로 reset 또는 revert이다. reset, revert 차이점 reset - 특정 커밋으로 돌아간 다음 이후 행적은 히스토리에서 지워버린다. revert - 특정 커밋의 변경 내용을 반대로 실행하고 revert했다는 커밋을 하나 더 추가한다. 즉 reset으로 과거로 돌아가면 아예 없었던 일이 되지만 revert로 돌아가면 변경 내용만 롤백해주고 커밋 내역은 남아 있는 것이다. 예시 다음과 같이 4개의 커밋이 있다고 하자. commit bbaa3d2e16c2445bf96a20e1eb3518afa84bbdd8 (HEAD ..
OCP 개방-폐쇄 원칙 (Open/closed principle) • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다 • 이런 거짓말 같은 말이? 확장을 하려면, 당연히 기존 코드를 변경? • 다형성을 활용해보자 • 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현 • 역할과 구현의 분리 우테코 1주 차 미션인 자동차 경주 미션을 생각해보자. public class Car { private int position; public void move(int movingValue) { if (movingValue >= STANDARD_OF_MOVING) { position++; } } 자동차가 움직이기 매개변수로 받은 정수가 기준 이상이어야 한다. 현재 이 movingVal..
모든 원시 값을 포장하라라는 말이 있다. 예를 들어 보자. 어떤 로직을 실행하는데 필요한 실행 횟수를 입력받아야 한다. '실행 횟수'인만큼 1 이상인 정수여야 한다. 시도 횟수를 원시 값 그대로 사용할 경우 int attemptNumber = 5; public void excute(int attemptNumber) { if (attemptNumber < 1) { throw new IllegalArgumentException(); } // attemptNumber 사용 } 시도 횟수를 사용하려면 사용하는 곳에서 검증 작업이 들어가야 한다. 만약 이 '시도 횟수'라는 개념이 여러 곳에서도 쓰인다면 이 검증 로직은 매번 들어가야 한다. (int attemptNumber는 신뢰할 수 없으므로 항상 검증하고 사용..