코코코딩공부/JAVA

    나는 어떤 자바 버전을 선택해야 할까?

    나는 지금까지 우테코를 진행하면서 자바 11 버전으로 진행해왔다. 이번 프로젝트를 진행하면서 자바 버전에 대한 이야기가 나왔는데 17을 쓰자는 크루의 의견도 있었다. 사실 나의 의견은 지금까지 반년동안 자바 11을 사용해왔기 때문에 자바 11을 사용해도 되지 않을까? 였지만 17 과 11의 명확한 차이를 알고 사용을 결정하는 것이 좋을 것 같아 알아보게 되었다. 자바 버전 선택 먼저 사람들은 java 8, 11 ,17 버전을 현재까지 주로 사용을 하고 있었다. 그 이유로써는 LTS 즉 Long Term Support이기 때문이다. 출시 몇년동안 보안, 버그 수정이 이루어지기 때문에 이와 같은 버전을 사용하는 것이다. 자바9, 10, 12, 13, 14, 15, 16은 각각 자바 17에 모든 내역이 모두 ..

    [JAVA] 정적 팩토리 메소드

    들어가며 우테코를 시작하고 난 이후로 정적 팩토리 메소드 라는 말을 많이 들어왔다. 이펙티브 자바 책을 보면 첫 장이 정적 팩토리 메소드인 만큼 한번 쯤 알고 싶었고, 이번 체스 미션에서 사용해보았기에 정리해보려고 한다. 정적 팩토리 메소드 란 ? 우리는 흔히 인스턴스 객체 생성을 하는데 생성자를 사용한다. new ~~() 이런식으로 작성을 하는데 이를 생성자가 아닌 정적(static)메소드로 하는 것을 정적 팩토리 메소드라고 한다. 체스미션에서 사용한 정적 팩토리 메소드이다. 이를 통해 Command를 만들었다. public static Command of(String command) { return validateCommand(command); } 정적 팩토리 메소드를 왜 사용하는가 ? 장점 이름을 ..

    [Gradle] dependency 차이점 (CompileOnly, RuntimeOnly, api, implementation)

    들어가며 DB를 연동하면서 Gradle 에 runtimeOnly 'mysql:mysql-connector-java:8.0.28' 의존성을 추가해주었다. 아무 생각 없이 사용하였었는데 리뷰어인 토니로부터 이렇게 퀴즈를 받게 되었다 ! Classpath 클래스 혹은 Jar파일이 존재하는 위치이다. gradle의 Dependencies는 compieClasspath, runtimeClasspath, testCompileClasspath, testRuntimeClasspath 로 구분이 된다. 앞 2개는 로직을 실행할 때, 뒤 2개는 test 로직을 수행할 때 사용된다. CompileCalsspath 컴파일을 잘 수행하기 위해 필요한 클래스 및 jar을 나타낸다. RuntimeClasspath 런타임시 애플리..

    [JAVA] 캐싱

    들어가며 블랙잭 미션을 하면서 캐싱이라는 말을 처음 들어보았다. 내가 아는 Cache는 메모리 관련 내용 밖에 없었는데 자바에서 듣게 되니 궁금해서 알아보게 되었다. 캐시 캐시 란 데이터, 값을 미리 복사해 놓는 임시 장소를 의미한다. 이렇게 복사를 해놓는 이유는 미리 복사를 해 놓음으로써 값을 다시 계산하거나, 데이터에 접근하는 시간을 줄일 수 있다. 빠르게 데이터에 접근할 수 있는 것이다. 캐싱 캐싱이란 위에서 말한 ‘캐시’를 하는 것이다. 체스 미션에서의 캐싱 나의 체스 미션은 FILE & RANK 라는 행열로 이루어진 보드판 위에서 진행하는 게임이었다. 이는 enum타입으로 진행하였다. 처음에는 ‘a~h’ , ‘1~8’로만 enum을 만들어 놓고 사용자가 입력한 값에 대해서 그때 그때 찾는 방식으..

    [JAVA] 상속 과 조합

    들어가며 자바에는 상속이라는 개념이 있다. 우테코 과제를 진행하면서 상속을 사용했더라면 더 좋았을텐데.. 했지만 시간의 부족함으로 처리하지 못했다. 그래서 상속을 한번 정리해보기로 했다. 상속 자바에는 부모클래스와 자식클래스가 있다. 자식 클래스는 부모 클래스의 멤버를 상속받아 그대로 사용할 수 있다. 상속을 하는 이유 ? 이미 만들어져 있는 클래스를 재사용 할 수 있어서 효율적이고 중복된 코드가 줄어든다. 유지보수가 쉽고, 확장성이 용이하고, 재사용이 가능하고, 코드가 간결해진다. 클래스 상속 자식 클래스 이름 앞에 extends 키워드를 사용한다. 다중상속을 허용하지 않는다. //부모 public class Parent { ... }; //상속받은 자식 public class Child extends..

    [JAVA] VO(Value Object) 란 무엇인가 ?

    들어가며 VO란 값 객체로만 알고 있었다. 값을 가진 무언가? 라는 개념으로 이해했는데 이에 대해 조금 더 자세히 알고 싶어서 정리해보게 되었다. VO란 ? VO란 값을 가지는 객체. 즉 값 자체로 의미를 갖는 객체이다. 속성 값이 모두 같으면 객체이다. 불변이다. VO를 사용하는 이유 원시값 타입이 도메인 객체를 모델링 하기에 충분하지 않기에 사용한다. 도메인에서 의미있는 값으로 VO를 묶어서 사용해야 한다. 여기서 든 의문은 원시값 포장과 다른점이 뭐지? 라는 것이였다. VO 의 필수조건은 먼저 equals & hashCode 메서드를 재정의 수정할 수 없는 불변 이다. 그러므로 변수를 수정하는 로직이 있다면 이는 VO가 아니다. 원시 타입의 기능을 사용하지 않기에 VO를 사용한다. private f..

    [JAVA] 제네릭 Generic

    들어가며 우테코에서 Generic 관련 미니 미션을 수행하게 되었다. 수행을 하면서 느낀 것은 제네릭에 대해서 대충은 알고 있었지만 자세히 모른다고 생각하게 되었고 한번 정리해볼 필요가 있다고 느꼈다. 제네릭 제네릭이란 클래스를 정의 할 때 구체적인 타입을 적지 않고 변수로 적는 것이다. 제네릭은 모든 종류의 타입을 다룰 수 있도록, 클래스나 메소드를 타입 매개변수를 이용하여 선언하는 기법이다. 타입 매개변수란 타입을 변수로 표시하는 것을 의미한다. 즉 타입을 어떤 클래스의 매개변수로 보는 것이다. 내부 데이터 타입을 외부에서 지정하는 것. 제네릭이 없었다면 ? public class Test{ private Object data; public void set(Object data){ this.data ..

    [JAVA] 예외 처리

    들어가며 나는 지금까지 예외처리에 대해서 깊게 생각해 본적이 없는 것 같다. 단순하게 ‘문제가 생기면 예외를 던진다.’ 라고 생각하며 살아왔던 것 같다. 하지만 우테코에서 예외처리 강의를 듣고 한번 생각 정리를 할 필요가 있을 것 같아서 정리해보게 되었다. 예외(Exception) 와 에러(Error) 예외를 알아보기 전에 먼저 에러와 예외를 구분할 필요가있다. 에러는 코드로 복구 될 수 없는 오류를 의미한다. 개발자가 미리 예측하여 방지할 수 없다. OutOfMemoryError, StackOverflowError 등이 발생한다. 예외는 개발자가 직접 예측하여 막을 수 있는 오류를 의미한다. 개발자의 코드, 로직, 사용자 에 의해 발생 가능하며 방지할 수 있다. 하단 그림은 에러와 예외의 상속 관계이다..

    [JAVA] 일급 컬렉션

    들어가며 우테코 미션을 진행하면서 일급 컬렉션에 대해서 엄청엄청 많이 들어보았다. 그래서 정리를 해보고자 한다. 일급 컬렉션 일급 컬렉션이란 값 객체(Value Object)를 포함하고 있는 컬렉션이다. 값 객체란 값 그 자체로 의미가 있으며, 변경 불가능하다는 특징을 가지고 있는 것이다. 일급 컬렉션은 이러한 값 객체들을 모아서 하나의 객체로 다루는 것을 의미한다. Collection을 Wrapping하면서, 그 외 다른 멤버 변수가 없는 상태를 일급 컬렉션이라 한다. 일급 컬렉션의 장점 코드 가독성의 향상 값 객체가 포함된 컬렉션을 변수로 사용하는 것보다, 일급 컬렉션으로 묶어서 사용하는 것이 가독성이 더 좋다. 의미 전달력의 향상 일급 컬렉션을 사용하면, 컬렉션의 용도와 의미를 명확하게 전달할 수 ..

    [JAVA] 원시값 포장

    들어가며 저번 미션부터 원시값 포장에 대한 요구사항들이 많았다. 원시값 포장은 무엇인지에 대해 정리를 해보려고한다. 처음에는 원시값 포장 ? String , int값을 포장한다는 것인가 ? 왜 하지 ? 라는 생각이 많이 들었지만 확실히 원시값 포장을 하는게 더 좋다고 생각이 들었다. 원시값 포장 원시 타입의 변수를 객체로 포장한 것이다. private final String name; public Name(String name) { this.name = name; } public String getName() { return this.name; } 이번 사다리 타기 미션인데 name이라는 단순 문자열을 Name로 포장, 감싸주었다. 이렇게 감싸 주었기 때문에 name을 모아놓는 List또한 변경이 되었다..