제네릭이란 JDK 1.5에서 처음 도입된 기능으로 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기술을 말한다. 자바에서 리스트를 사용할 때 로 타입을 지정했던 것이 바로 제네릭이다. public interface List extends Collection { ... } --- List list = new ArrayList(); // 사용 예시 제네릭의 필요성 (사용 이유) 1. 컴파일 타임의 타입 안전성 제네릭으로 타입을 지정하면 자바 컴파일러가 컴파일 타임에 강력하게 타입을 체크해서 이상이 있을 경우 오류를 발생시켜준다. 컴파일 오류는 런타임에 발생하는 오류보다 훨씬 안전하다. 2. 불필요한 형 변환 삭제 제네릭이 없는 List를 사용하는 아래와 같은 코드가 있다고 해보자. List ..
스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O 스트림 자바에서는 어느 한 쪽에서 다른 쪽으로 데이터를 전달하기 위해서는 두 대상을 연결할 무언가가 필요한데, 이를 스트림이라 한다. 즉, 스트림은 데이터를 전송하는데 사용되는 연결 통로 의 역할을 하고 이를 통해 I/O가 이루어진다. 스트림은 단방향으로만 데이터를 전송할 수 있다. 따라서 입력과 출력을 동시에 처리하기 위해서는 아래와 같이 입력 스트림과 출력 스트림, 총 두 개의 스트림이 필요하다. 스트림은 먼저 보낸 데이터를 먼저 받게 되고, 중간에 건너뜀 없이 데이터를 전송한다. 즉, 큐와 같은 FIFO 구조로 이루어져있다. NIO (New I/O) 자바 1.4버전부터 추가된 API로 기존 스트림을 사용하는 I..
어노테이션이란? 어노테이션은 사전적으로는 '주석' 이라는 의미이다. 자바에서 어노테이션은 클래스, 인터페이스, 메소드, 필드 등에 붙어서 컴파일러와 JVM에게 추가적인 정보(metadata)를 제공하는 역할을 한다. 어노테이션이 만들어진 이유 어노테이션 등장 이전에는 XML을 사용해 소스 코드의 메타 데이터를 작성하고 유지했다. 시스템과 분리되어 있으므로 어떤 면에서는 유지보수성이 좋다고 할 수 있으나, 프로그램이 방대해짐에 따라 오히려 유지보수가 어려워지는 문제가 발생했다. 어노테이션은 소스 코드에 바로 메타데이터를 작성할 수 있으므로 보다 직관적으로 메타 데이터를 작성할 수 있다. 추가로, 어노테이션은 어노테이션 프로세스를 통해 컴파일 타임에 코드나 기타 파일의 생성 등 작업이 가능하다. 어노테이션이..
enum 이란? enum 타입은 특수한 데이터 타입으로, 미리 지정된 상수만 대입할 수 있다. 미리 정의한 enum 클래스 내의 상수만 enum 타입에 대입될 수 있다. 예를 들어 방위(NORTH, SOUTH, EAST, WEST)나 요일(MONDAY, …) 등의 상수를 미리 정의하는 용도로 사용 가능하다. Enum 클래스는 가장 간단하게는 아래와 같이 정의할 수 있다. public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } Enum에 정의된 상수들은 각각 해당 enum 클래스의 객체이다. 이렇게 미리 정의된 상수만 객체로 사용할 수 있게 하여 enum 타입에 미리 정의된 값만 대입될 수 있게 하는 것이다. (e..
Process와 Thread [출처 - https://gyoogle.dev/blog/computer-science/operating-system/Process%20vs%20Thread.html] Process 메모리에서 실행되는 프로그램 메인 쓰레드 포함 최소 1개의 쓰레드를 갖는다 프로세스는 각각 별도의 주소 공간에 할당된다 (독립적) Thread 프로세스 안에서 실행되는 여러 흐름 단위 하나의 프로세스 안에 여러 쓰레드를 구성해 각 쓰레드가 각각의 작업을 맡아서 처리 쓰레드가 있어 다수의 작업을 동시에 처리할 수 있다 쓰레드는 Stack 만 별도로 할당 받고 나머지 영역은 프로세스의 것을 서로 공유한다 Context Switching에 들어가는 오버헤드가 적어 각각을 별도의 프로세스로 구성하는 것보다..
자바에서 예외 처리 방법 (try, catch, throw, throws, finally) 예외 처리의 목적 프로그램이 실행되다보면, 여러가지 이유로 인해 예외가 발생한다 이러한 상황이 발생했을 때 예외 처리 로직을 미리 작성해둠으로써 프로그램의 비정상적인 종료를 막고 프로그램의 상태를 정상 상태로 돌려놓기 위함 try-catch 기본적으로 예외는 try-catch 문을 통해 처리할 수 있다. try {} 에 예외가 발생가능한 로직을 넣고 catch(Exception e) {} 에 e 예외 발생 시 수행할 로직을 넣는다 발생한 예외가 catch() 문 괄호 안의 예외 클래스 하위의 클래스이면 해당 catch() {} 본문이 수행된다. 만약 발생한 예외가 최초로 만난 catch() 문 괄호 안의 예외 클래..
추상 클래스와 인터페이스 자바8부터 인터페이스에 default, static 메서드를 정의할 수 있게 되면서 추상 클래스와 인터페이스를 어떨 때 어떻게 구분해서 사용해야 하는지가 혼란스러워졌다. 이에 인터페이스에 대해 공부하기 전에 추상 클래스와의 차이를 먼저 정리해보았다. 앞선 주차 스터디에서 추상 클래스에 대해서는 이미 학습했었는데, 추상 클래스는 여러 클래스가 가진 공통 속성을 추출하기 위해 사용한다고 했다. K5, 소나타 등의 클래스가 자동차 라는 추상 클래스로 묶일 수 있는 등의 예시를 생각할 수 있을 것 같다. 이들을 추상 클래스로 묶음으로써 클래스 별로 다른 부분을 제외하고 공통적인 속성과 행위를 하나의 클래스에서 관리할 수 있다는 장점이 생기게 된다. 공통점 이 둘의 공통점은 아래와 같다...
package 키워드 패키지란 자바에서 패키지는 연관있는 클래스들을 묶는데에 사용된다 이를 사용하면 name conflict를 막고 보다 maintainable한 코드를 작성할 수 있다 패키지 종류 Build-in Packages (JAVA API 로부터의 패키지) 자바 8까지 rt.jar 에 포함된 라이브러리를 포함 자바 9이상부터는 jmods 디렉토리에 존재 BootStrap ClassLoader가 있기 때문에 Built-in 패키지를 사용할 수 있는 것 User-defined Packages (개발자가 직접 생성한 패키지) FQCN Full Qualified Class Name의 약자 모든 클래스에는 정의된 클래스 이름 + 패키지 이름이 있으며 이 둘을 합쳐야 완전하게 하나의 클래스를 지칭하게 됨 ..
자바 상속의 특징 상속 한 클래스(자식 클래스)가 부모 클래스의 모든 속성(필드)과 행동(메소드)를 취득하는 메커니즘 즉, 부모 클래스를 기반으로 새로운 클래스를 만들 수 있다 OOP의 중요한 요소 중 하나 상속을 사용하는 이유 메소드 오버라이딩 (runtime polymorphism이 가능해진다) 코드 재사용성 상속 문법 extends 키워드를 사용 public class Parent {} --- public class Child extends Parent {} 상속 구조 자바에서 가능한 구조 Single Multilevel Hierarchical public class ClassA {...} // Single public class ClassB extends ClassA {...} // Multile..
클래스란? 클래스는 공통의 특징(characteristics)/행동(behavior)/속성(properties, attributes)을 공유하는 객체들의 집합 클래스는 다양한 타입의 변수들과 메소드의 그룹 클래스가 포함하는 것들 data member (field) - 객체의 데이터가 저장되는 곳 method - 객체의 동작에 해당 constructor - new 연산자로 호출되는 메소드로 객체 생성 시 필드의 초기화를 담당 nested class - 클래스 내부에 또 다른 클래스를 선언할 수 있음 interface (!!) 내부 클래스 (Inner Class) 내부 클래스는 외부 클래스의 private을 포함한 멤버들에 쉽게 접근이 가능하며 연관된 클래스를 그룹핑할 수 있다는 장점 때문에 사용 내부 클래..