인터페이스는 과연 무엇일까? interface?? 초기의 인터페이스는 void test(); 요런식으로 구현체가 없는 상태로 존재하였다. 그래서 인터페이스를 implements을 하게되면, 구현체가 반드시 필요하였습니다. 하지만 자바8부터 인터페이스에도 구현체를 작성할 수 있게 되었다. 구현체를 작성하는 방법은 총 3가지다. 1. static 2. default 3. private 원래 언제 만들어졌는지 적으려 했지만 귀찮은 관계로 넘어가자. 아무튼 이 3가지의 공통점은 구현체를 구현을 해야 된다는 점이다. 근데 여기서 드는 의문점이 있다. static, private같은 경우는 기존 클래스에서 사용법이 크게 다르지 않다. static은 메모리상에 먼저 올라가구 private는 그 클래스내에서만 사용이 ..
SOLID는 객체지향 원칙으로 SRP, OCP, LSP, ISP, DIP의 앞자리를 하나씩 부르는것을 말한다. 생각보다 원칙을 지키면서 코드를 작성하는 것은 쉽지 않고, 설령 원칙을 지키면서 코드를 작성할 수 는 있지만, 원칙을 지키기다 보면 인터페이스나 클래스를 추가하게되 오히려 위 원칙을 지키지 않는 것이 훨씬 더 좋은 상황이 발생할 수 도 있다. (사람바이사람, 상황바이상황) 따라서 상황에 맞춰서 SOLID원칙을 지키면서 할지 아니면 그냥 구현으로 할지 결정을 해야한다. 그러면 이제 SOLID를 하나씩 살펴보면서 어떻게 사용될지 생각해보자. SRP : 단일 책임 원칙 이 원칙은 하나의 클래스에는 단 하나의 행동만 가져야 된다는 원칙이다. 오해하면 안되는게 절대로 하나의 기능만 있어야 된다는 뜻은 절..
LocalDateTime은 LocalDate와 LocalTime두 개를 합친 클래스입니다. 이들은 모두 java 8에 처음 등장하였습니다. 그런데 이상합니다. 자바 릴리즈 노트에 따르면 JDK Releases The release information on this page covers the Java SE releases that were widely distributed or significant to the development of Java. It does not cover patch releases or other one-off releases. java.com 2014-03-18 Major 8 LTS Documentation, JSR 337, Configurations 자바 8은 2014년 3..
람다는 왜 만들어졌을까? 람다를 사용하게 되면 굉장히 코드가 단순해진다는 것을 느낄 수 있다. 런타임시에는 익명 함수로 사용하든 람다식으로 고쳐서 사용하든 상관없다는 뜻이 된다. 최대한 간결하게 만들어서 실수를 방지 하는것이 좋지 않을까? 예를 들어, Hello hello = new Hello() { @Override public void write(String writer) { System.out.println(writer); } }; 다음과 같은 익명 함수가 존재한다고 해보자. 이것을 람다로 사용하게 된다면, Hello hello = writer -> { System.out.println(writer); }; 단, 한줄로 코드가 변경되었다. 여기서 의문인것이 어노테이션, enum,제네릭과 달리 이전 ..
모듈(module)은 역사적으로 프로그래밍이라는 관점에서는 기본적으로 본체에 대한 독립된 하위 단위라는 필연적인 개념의 큰 틀을 따르고 있지만 본체와 모듈 간에 가지고 있었던 문제들을 해결해 나가는 과정에서 발전하였다. 모듈에 가장 큰 영향을 미쳤던 클래스 그리고 라이브러리가 향상됨에 따라 점차 발전하였다. 이러한 지속 가능성은 이것의 가장 큰 장점 중 하나이다. 초기에는 분리된 독립성의 모듈로 도입되었으나 점차로 객체화, 캡슐화, 모듈화 프로그래밍 기법 등 여러 기능들이 추가되면서 점차적으로 영역이 나뉘어가고 있다. 그러나 이로 인하여 모듈성을 제대로 반영하지 못하고 있다는 비난을 받을 수도 있다. 한편 이러한 비난은 모듈 시스템, 모듈 프로그래밍이 갖는 현재의 한계를 인식하고 보다 안정적으로 발전하기..
제네릭은 왜 사용할까? 제네릭은 JDK1.5부터 새롭게 등장했다. 그러면 제네릭이 도입되면서 어떤것이 바뀌었는지 고민해보자. 제네릭을 사용하면 타입 안정성이 증가하고, 타입체크와 형 변환을 생략할 수 있어서 코드가 간결해 진다고 한다. 과연 사실일까? 제네릭을 사용하는 대표적인 클래스로는 List가 있다. List list = new ArrayList(); 이 리스트는 어떠한 값이든 저장할 수 있다. List list = new ArrayList(); list.add(2); list.add("Hello"); list.add(100L); list.add(1.5); int, string, long, double다양한 타입이 들어왔다. 이것을 출력해보자. for (Object object : list) { S..
프로세스와 쓰레드 프로세스 : 실행중인 프로그램 쓰레드 : 프로세스안에서 작업을 수행 jvm => 조그만 os 거대 os(맥, 위도우,리눅스)안에 실행하는 프로그램(java)에서 사용하는 os 어떻게 보면 jvm이 os라 생각해도 무방하다고 생각한다. 하얀것이 프로세스 , 파란것이 쓰레드 쓰레드들은 각자의 영역을 지키면서 프로세스의 일을 함께 처리. 멀티 테스킹 vs 멀티 쓰레딩 멀티 테스킹 : 여러 가지 프로그램을 동시에 실행 하는 것을 의미한다. 멀티 쓰레딩 : 하나의 프로그램을 수 많은 쓰레드로 실행하는 것을 의미한다. CPU의 코어 => 쓰레드의 갯수 멀티 쓰레딩의 장 단점 - cpu의 사용률을 향상 시킨다. - 자원을 효율적으로 사용할 수 있다. 쓰레드도 어떻게 보면 하나의 프로그램이라고 할 수..
I/O 입력과 출력을 뜻하는 용어로, 입출력은 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다. 스트림/버퍼/채널 스트림 스트림은 흐름이라는 뜻을 가지고 있다.(람다의 스트림과 의미는 같을지도 모르겠지만 전혀 다른 용어이다.) 간단히 말하면 입력에서 출력으로 흐르는 흐름을 뜻한다. 그냥 통로 입력이 출력으로 가는 통로라고 생각해도 될것 같다. 입력에서 출력으로 가기 때문에 단방향으로 데이터 전송이 된다. 왜냐하면 출력에서 입력으로 가는것은 말도 안 되기 때문이다. 만약에, 한 개가 아니라 여러개를 동시에 보낸다고 한다면 어떻게 될까? 이런식으로 큐 형식(FIFO)으로 진행이 된다는 것을 알 수 있다. 즉, 먼저 입력받은것이 가장먼저 입력되는 시스템인거죠. 버퍼 그렇다면 버퍼는 ..
어노테이션 어노테이션은 주석이라는 뜻을 가지고 있다. 기본적으로 우리가 아는 주석은 // 또는/* */ 이렇게 생겼는데, 어노테이션과 일반적인 주석은 뭐가 다른걸까? - 어노테이션의 역할도 주석과 크게 다르지 않는다. - 일반주석과 큰 차이점은 코드를 작성할 수 있다는 것이 다르다. - 코드를 작성할 수 있다는 뜻은 어노테이션으로 뭔가를 할 수 있다는 뜻이 된다. - 어노테이션도 enum과 마찬가지로 1.5에 등장했다고 한다. 어노테이션을 정의하는 방법 public @interface Make { } 이렇게 정의하면 된다. enum은 java.lang.Enum에 상속되어있다고 학습하였다. 그러면 어노테이션의 조상님은 과연 뭘까? 바이트 코드를 통해 확인해보자. public abstract @interfa..
enum : 열거형이라고 불리며, 서로 연관된 상수들의 집합이라고 불린다. 원래 자바에는 enum클래스가 존재하지 않았지만, JDK1.5에 추가되었다고 한다. C언어 같은 언어에서는 enum클래스의 역할은 단순히 상수들의 집합으로 사용되었지만, 자바는 타입까지 비교가 가능하다. enum을 만드는 방법 기본적으로 public enum Language { C, JAVA, KOTLIN, JAVASCRIPT } 이렇게 만들면 된다. 이들은 왼쪽부터 오른쪽으로 0번부터 3번으로 측정된다. System.out.println(Language.C.ordinal()); System.out.println(Language.JAVA.ordinal()); System.out.println(Language.KOTLIN.ordin..
자바가 제공하는 예외 계층 구조 비유 우리가 병이 생긴다면, 병원으로 간다. 그 병이 치명적일 수도 있고, 치명적이지 않을 수 있다. 만약, 그 병이 치명적이라고 가정한다면, 제대로 치료를 받지 않으면 죽게 될 수도 있다. 만약, 그 병이 치명적이지 않는다고 한다면, 병원에 가지 않고 자가 치료가 가능할지도 모른다. 실제 프로그램도 마찬가지다. 에러가 치명적이라면, 그 예외를 해결을 해야된다. 그래야 프로그램을 계속 유지할 수 있기 때문이다. 컴파일 에러 가벼운 감기 처럼(아닌 분들도 계시지만 ㅜㅜ),우리가 코드상에서 스스로 해결할 수 있는 에러도 존재한다. 이것을 컴파일 에러라고 한다. 하지만 이것도 치료하지 않는다면, 죽을 수도 있다. 이것을 치료조차 하지 않는다면? 여기서 알 수 있는 건 아무리 가..
프록시는 무엇을 뜻하는 걸까? 대안이라는 뜻을 가지고 있다. 가장 대표적인 예로 JPA를 들 수 있다. 간단하게 JPA코드를 작성해보겠다. public interface BookJpaRepository extends JpaRepository { } @SpringBootTest class BookJpaRepositoryTest { @Autowired BookJpaRepository bookJpaRepository; @Test void test() { System.out.println(bookJpaRepository); } } 인터페이스로 만들었지만.. 다양한 메소드를이 나오는 것을 확인 할 수 있다. 물론, 다른 인터페이스를 상속한다음 실행해도 위와 같은 결과는 나온다. 하지만.. 특정 메소드를 실행한다고..