전체 글

자동차 경주 미션 하나의 객체가 많은 책임을 맡지 않도록 하자 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. 이름을 가질 수 있다. 단순히 매개변수나 생성자 자체만으로 반환된다면 객체의 특성을 제대로 설명..
· JAVA
자바를 컴퓨터가 알아듣기까지 컴파일 인간이 이해하기 쉬운 언어를 기계어로 번역하는 과정 자바 코드를 바이트 코드(=바이너리 코드) 변환해서 컴퓨터가 이해할 수 있도록 변환 System.out.println(“HelloWorld”) -> 01010100110100-> 컴퓨터가 이해 컴파일러 컴파일 하는 프로그램 바이트 코드 0과 1로 이루어진 코드, 컴퓨터가 이해할 수 있다. 0과 1의 조합은 OS마다 다르다. (윈도우, 맥, 리눅스) 운영체제마다 “Hello World”가 실행 안될 수도 있다. 그래서 C언어 같은 경우 각각 다른 컴파일러가 필요하다. JVM 자바 컴파일러가 하나 있고 각 OS로 바로 가는 것이 아니라 JVM을 거쳐서 간다. (각 OS와 호환시켜 주는 아이) 자바 가상 머신의 약자 (Ja..
· JAVA
스트림(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
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..
· JAVA
모든 원시 값을 포장하라라는 말이 있다. 예를 들어 보자. 어떤 로직을 실행하는데 필요한 실행 횟수를 입력받아야 한다. '실행 횟수'인만큼 1 이상인 정수여야 한다. 시도 횟수를 원시 값 그대로 사용할 경우 int attemptNumber = 5; public void excute(int attemptNumber) { if (attemptNumber < 1) { throw new IllegalArgumentException(); } // attemptNumber 사용 } 시도 횟수를 사용하려면 사용하는 곳에서 검증 작업이 들어가야 한다. 만약 이 '시도 횟수'라는 개념이 여러 곳에서도 쓰인다면 이 검증 로직은 매번 들어가야 한다. (int attemptNumber는 신뢰할 수 없으므로 항상 검증하고 사용..
더즈
DOES-LOG