01 : 변수
02 : 연산자
03 : 제어문
04 : 배열
06 : OOP
07 : 객체배열
08 : 상속
09 : 다형성
10 : 예외처리
11 : 컬렉션
메모리에 값을 기록하는 장소
변수를 사용하는 이유 : 지속적으로 사용이 가능해서
int i = 10;
syso(10 + 10 + 10 10) 이게
syso(i + i + i i) 이렇게 바뀐다.
가독성이 좋아지고 재사용성 증가, 코드량 감소 유지보수에 용이하다.
데이터를 처리할때 일정한 기준 필요
데이터의 최소 저장 단위, 2진수로 이루어져 있어 0과1 이다
문자의 최소 단위, 8개의 비트가 모여 1개의 바이트를 구성
데이터를 저장 할 수 있는 공간을 할당
선언 방식
자료형 변수명;
int iNum;
double dNum;
자료형은 3가지로 나뉜다 논리형, 숫자형, 문자형
숫자형은 또 2가지로 나뉘는데 정수형과 실수형이다.
또 정수형은 4가지의 종류가 있고, 실수형은 2가지의 종류가 있다.
문자형은 2가지로 나뉘는데 문자와 문자열이다.
문자는 1개 문자열도 1개이다
논리형 - 1개
표현식 : boolean
메모리 크기 :1byte정수형 - 4개
표현식 : byte
메모리 크기 : 1byte
표현식 : short
메모리 크기 : 2byte
표현식 : int
메모리 크기 : 4byte(정수 기본형)
표현식 : long
메모리 크기 : 8byte실수형 - 2개
표현식 : float
메모리 크기 : 4byte
표현식 : double
메모리 크기 : 8byte문자 - 1개
표현식 : char
메모리 크기 : 2byte문자열 - 1개
표현식 : String
메모리 크기 : 참조형
- 대소문자가 구분되며 길이 제한이 없다.
- 예약어 불가
(true, final, String 등)- 첫 단어가 숫자면 안된다.
(1age)- 특수문자는 ''와 '$'만 사용한다
(사용시 컴파일 에러는 없지만 관례상 사용 x, $는 내부 클래스에서 사용함)- 여러 단어 이름은 단어의 첫 글자를 대문자로 한다
(userName)
변수에 값을 대입하는 행위
변수는 마지막에 대입한 값만 저장한다.
값 대입
int age;
age = 10;리터럴
변수에 대입되는 값 자체
char c = 'A';
변수의 초기화
변수를 사용하기 전에 처음으로 값 저장하는 행위
지역변수는 반드시 초기화해야 한다.
선언 후 초기화 하는 방식과 선언과 동시에 초기화 하는 방법이있다
수학에서는 변하지 않는 값을 의미한다.
상수도 변수처럼 선언 후 초기화 하는 방식과 선언과 동시에 초기화 하는 방법이 있다
상수 선언 방법
final int AGE;
상수 초기화 방법
선언과 동시에 초기화
final int NUM = 100;
선언 후 초기화
final int NUM;
NUM = 100;
값의 자료형을 바꾸는걸 형변환이라고 한다
값의 범위가 큰 자료형과 값의 범위가 작은 자료형을 연산할때 자동 형변환이 일어난다
값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환시킨다.
강제 형변환시 데이터 손실이 발생 데이터의 변형, 손실을 감수하고 강제로 변환
범위를 초과하면 허용된 범위 이상의 비트를 침범하는데 이걸 오버플로우라고 한다.
Static : static 예약어로 선정된 필드, 메소드가 저장되는 공간 클래스 변수 등
HEAP : new 연산자에 의해 동적으로 할당하고 저장되는 공간, 객체, 배열 등
STACK : 메소드를 호출하면 자동생성, 메소드가 끝나면 자동소멸,
지역변수, 매개변수 메소드 호출 스택 등
논리 값을 부정하여 반대 값으로 변경
제어문을 활용할때 많이 쓰임
피연산자에 값에 1을 더하거나 빼는 연산자로 위치에 따라 결과 값이 다름
전위 연산 : 먼저 연산 후 실행
후위 연산 : 실행 후 연산
%는 나머지 값 구하는 연산
데이터가 같은지, 다른지 비교할 때 쓰이며 항상 결과값은 논리 값으로 나타남
두 피연산자의 값의 크기 비교
기본형 boolean과 참조형을 제외하고 나머지 자료형에 모두 사용 가능
논리 값 두 개를 비겨하는 연산자
&& : 두 피연산자가 모두 참일때 참 반환(and)
|| : 두 피연산자중 하나만 참이여도 참 반환(or)
다른 연산자와 대입 연산자가 결합한 것으로
자기 자신과 연산 후 연산 결과를 자기 자신에게 누적 대입
조건식의 결과에 따라 연산을 처리하는 방식으로 결과 값이 참일경우 왼쪽, 거짓일 경우 오른쪽 식 수행
조건식 ? 식1 : 식2;
프로그램 수행 흐름을 바꾸는 역할을 하는 제어문 중 하나로 조건에 따라 다른 문장이 ㅎ수행 됨
if(조건식 a){
수행될 코드;
} else if (조건식 b){
수행될 코드;
} ...
switch(조건식)
case 결과 a : 수행될 코드; break;
case 결과 b : 수행될 코드; break;
...
drfault : 수행될 코드;
조건식에 맞는 case 문으로 이동함
프로그램 수행 흐름을 바꾸는 역할을 하는 제어문 중 하나로 특정 문장들을 반복해서 수행하도록 함
for(초기식; 조건식; 증감식){
수행될 코드;
}
while(조건식) {
수행될 코드;
[증감식 or 문기문];
}do ~ while
do안에 코드를 먼저 실행하고 while 수행
반복문 안에 반복문을 쓸 수 있다.
반복문에서는 break문 자신이 포함된 가장 가까운 반복문을 빠져나가는 구문
반복문 내에서만 사용 가능하다
반복문 실행 시 continue 아래 부분은 실행하지 않고 반복문을 다시 수행함
같은 자료형의 변수를 하나의 묶음으로 다룸
배열은 저장된 값마다 시작 번호가 0으로 시작함
배열의 특징
1. 한가지 자료형만 저장 가능하다
2. 여러 값을 저장 할 수 있다.
3. 한 번 크기를 지정하면 변경 불가능하다.
자료형 [] 배열명;
자료형 배열명[];
자료형 [] 배열명 = new 자료형[배열크기];
자료형 배열명 [] = new 자료형[배열크기];
ex) int [] arr = new int[3];
int arr[] = new int[3];
배열은 참조 변수로 Heap영역에 할당되며 배열 공간의 주소를 저장
배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값 처리
arr[0] = 1;
arr[1] = 2;
for문을 이용한 초기화
for(int i = 0; i < arr.length; i++){
arr[i] = i;
}
다른 배열이 같은 주소를 가르키는것
주소만 복사함, 복사본을 수정하면 원본도 바뀜
다른 배열이 같은 주소의 다른 값을 가르키는것
원본과 독립적인 복사, 복사본을 수정해도 원본은 바뀌지 않음
3개로 보기도 하고 4개로 보기도 한다
1. 캡슐화
2. 상속
3. 다형성
4. 추상화
자신의 속성과 기능이 다른 것들과 구분이 되어 식별 가능한것
현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있음
모든 사건들은 객체간의 상호작용
new 연산자를 통해 메모리에 생성된것
객체의 특성을 정의한것
추상화랑 캡슐화가 적용되어야 함
유연성을 확보하기 위해서 구체적인건 제거하는 의미
필요한 공통점을 추출하고 불필요한 부분은 제거한다
추상화를 통해 정리된 데이터와 기능을 하나로 묶어 관리하는거
가장 중요한 목적인 데이터의 직접 접근을 제한을 원칙으로 한다
클래스 외부에서 직접적인 접근을 막음
멤버 변수에 대한 접근 제한은 private을 원칙으로 함
멤버 변수에 대한 연산처리를 목적으로 하는 멤버 메소드는 클래스 내부에 작성
멤버 메소드는 외부에서 접근 가능하도록 public으로 설정
new 연산자와 생성자를 사용하여 객체 생성 시 Heap 메모리 영역에 서로 다른 자료형의 데이터가 연속으로 나열/ 할당된 객체 공간
현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념으로
객체 지향 언어에서 객체의 개념은 메모리에 할당된 결과물
클래스 선언 방식
[접근 제한자][예약어] class 클래스명 {
}

[접근제한자][예약어] class 클래스명 {
[접근제한자][예약어] 자료형 변수명 [= 초기값];
}

같은 타입의 여러 객체가 필드에 공유할 목적으로 사용됨
프로그램 시작 시 정적 메모리(static) 영역에 자동 할당되는 멤버에 적용
하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어
인스턴스 블럭 ( { } ) - 인스턴스 변수를 초기화 시키는 블럭으로 객체 생성시 마다 초기화
static(클래스) 블럭 ( static{ } ) - static 필드를 초기화 시키는 블럭으로 프로그램
시작 시 한 번만 초기화
JVM 기본값 -> 명시적 초기값 -> 클래스 초기화 블록 초기값
JVM 기본값 -> 명시적 초기값 -> 인스턴스 초기화 블록 초기값 -> 생성자를 통한 초기값
객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때
객체 안에서 만들어지는 필드 초기값 + 생성 시 필요한 기능 수행
생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록함
생성자명을 클래스명과 똑같이 지정해야함
작성 안 해도 클래스 사용 시 컴파일러가 자동으로 생성
매개변수 생성자 작성 시 컴파일러가 기본 생성자를 자동으로 생성 안 함
한 클래스에 동일한 이름의 메소드를 여러개 작성함
같은 메소드 이름, 다른 매개변수의 개수 또는 다른 매개변수 타입, 순서
모든 인스턴스 메소드에 숨겨진 레퍼런스로 할당된 객체를 가리킴
함수 실행 시 전달되는 객체의 주소를 자동으로 받음
생성자, 같은 클래스의 다른 생성자를 호출 시 사용, 반드시 1번째 줄에 선언해야함
수학의 함수와 비슷하며 호출을 통해 사용함, 전달 값이 없는 상태로 호출하거나
어떤 값을 전달하여 호출함
수행 후 반환 값, 결과 값은 없을 수도 있음




필드에 변경할 값을 전달 받아 필드 값을 변경하는 메소드
필드에 기록된 값을 읽어서 요청한 쪽으로 읽은 값을 전달하는 메소드
해당 메소드 종료하고 자신을 호출한 메소드로 돌아가는 예약어임
반환 값이 있으면 반환 값을 가지고 돌아감
객체 참조형 변수를 저장하는 배열로 배열의 클래스명으로 지정하여 활용함
ex)
int[][] intArr = new int[5];
클래스명[] 배열명; Academy[] arr;
클래스명 배열명[]; Academy arr[];
배열명 = new 클래스명[배열크기]; arr = new Academy[5];
클래스명 배열명 [] = new 클래스명[배열크기] Academy[] arr = new Academy[5];
배열명[i] = new 클래스명(); arr[0] = new Academy(1,"KH정보교육원")
arr[0] = new Academy(2,"케이에이치")
클래스명 배열명[] = {new 클래스명(), new 클래스명()};
Academy arr [] = {
new Academy(1,"KH정보교육원")
new Academy(2,"케이에이치")};
배열명[i] = new 클래스명();
클래스명 배열명[] = {new 클래스명(), new 클래스명()};
다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고
상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능
클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약 정의
- 보다 적은 양의 코드로 새로운 클래스 작성 가능
- 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경 용이
- 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여
extends 사용
클래스간의 관계가 다중 상속보다 명호가하고 신뢰성 있는 코드 작성
자바에선 다중 상속 미지원
복합적인 기능을 가진 클래스를 쉽게 작성 가능
서로 다른 클래스로부터 상속 받은 멤버 간의 이름이 같은 경우 문제 발생
- 모든 클래스는 Object클래스의 후손
Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 가능- 부모클래스의 생성자, 초기화 블록은 상속 불가
자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행
자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶으면 super() 활용- 부모의 private멤버는 상속은 되지만 직접 접근 불가
자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우,
자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가
super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨서 생성하거나
setter, getter 메소드를 이용하여 접근
부모 객체의 생성자를 호출하는 메소드로 기본적으로 후손 생성자에 부모 생성자 포함
후손 객체 생성 시에는 부모부터 생성이 되기 때문에 후손 클래스 생성자 안에는
부모 생성자를 호출하는 super()가 첫 줄에 존재 (부모 생성자가 가장 먼저 실행되어야 하기 때문에 명시적으로 작성 시에도 반드시 첫 줄에만 작성)
매개변수 있는 부모 생성자 호출은 super(매개변수, 매개변수)를 넣으면 됨
상속을 통한 자식 클래스 정의 시 해당 자식 클래스의 부모 객체를 가리키는 참조변수
자식 클래스 내에서 부모 클래스 객체에 접근하여 필드나 메소드 호출 시 사용
자식 클래스가 상속 받은 부모 메소드를 재작성 하는 것
메소드 헤드라인 위에 반드시 Annotation, @Override 표시
부모 클래스의 메소드와 자식 클래스의 메소드 비교
- 메소드 이름 동일
- 매개변수의 개수, 타입, 순서 동일
- 리턴 타입 동일
- private 메소드 오버라이딩 불가
한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것
같은 메소드 이름
다른 매개변수 선언부(매개변수 타입, 개수, 순서)
메소드의 리턴타입은 오버로딩 조건과 관계 없음

상속이 불가능한 클래스
상속이 불가능한 클래스

다양한 형태를 갖는다. 라는 뜻
하나의 행동으로 여러 가지 일을 수행하는 개념
상속 관계에 있는 부모, 자식 클래스 간에 부모타입의 참조형 변수가
모든 자식 타입 객체의 주소를 참조할 수 있음
부모로 부터 상속받은 멤버만 참조 가능
부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형변환 하는 것
클래스 간의 형 변환은 반드시 상속 관계인 클래스 끼리만 가능
다형성을 이용하여 상속 관계에 있는 하나의 부모 클래스 타입의 배열 공간에
여러 종류의 자식 클래스 객체 저장 가능
ex)
Car[] carArr = new Car[5];
carArr[0] = new Sonata();
carArr[1] = new Avante();
carArr[2] = new Grandure();
carArr[3] = new Spark();
carArr[4] = new Morning();
다형성을 이용하여 메소드 호출 시 부모타입의 변수 하나만 사용해 자식
타입의 객체를 받을 수 있음
실행할 메소드 코드와 호출하는 코드를 연결 시키는 것
프로그램 실행 전 컴파일 단계에서 메소드와 메소드 호출부를 연결
컴파일 시 정적 바인딩된 메소드를 실행할 당시의 객체 타입을 기준으로 바인딩 되는 것
상속 관계로 이루어져 다형성이 적용된 경우, 메소드 오버라이딩이 되어 있으면
정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행
객체 주소를 참조하고 있는지 확인 할 때 사용
클래스 타입이 맞으면 true, 맞지 않으면 false 반환
몸체 없는 메소드를 포함한 클래스 (미완성 설계도)
몸체 없는 메소드
- 미완성 클래스(abstract 키워드 사용)
자체적으로 객체 생성 불가 → 반드시 상속하여 객체 생성- abstract 메소드가 포함된 클래스는 반드시 abstract 클래스
abstract 메소드가 없어도 abstract 클래스 선언 가능- 클래스 내에 일반 변수, 메소드 포함 가능
- 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능
상속 받은 자식에게 공통된 멤버 제공.
일부 기능의 구현을 강제화함
상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체
- 모든 인터페이스의 메소드는 묵시적으로 public abstract
- 변수는 묵시적으로 public static final
- 객체 생성은 안되나 참조형 변수로는 가능(다형성)
다형성을 이용하여 상위 타입 역할
인터페이스 구현 객체에 공통된 기능 구현 강제화
공동 작업을 위한 인터페이스 제공

상속
(자식클래스의) 공통된 부분을 추출하여 부모클래스를 만드는 것
→ 공통된 필드, 메서드를 가진 클래스를 만들고,
작성된 코드를 자식들이 물려받아 사용.
→ 코드길이 감소, 코드 중복 제거, 재사용성 증가, 자식에 대한 일관된 규칙 제공
[일반 클래스] 상속
부모 클래스도 객체로 만들수 있어야 하는 경우
[추상 클래스] 상속
연관된 클래스의 공통점을 묶되, 부모클래스는 객체로 만들 수 없는 경우
일부 미완성 클래스(abstract 메소드 0개 이상 포함)
EX) Animal 클래스 → 동물 객체는 어떤 동물인가?
eat(), breath() 는 어떻게 수행되는가? → 알 수 없음
하지만, 동물의 공통된 기능명은 알고 있음.
[인터페이스] 상속 : 접점
연관성이 낮거나 없는 클래스에게 공통된 기능을 제공할 때 사용.
ex) 키보드, 마우스, 스캐너, 카메라, 기울기 센서 (공통점 : 입력장치)
우연히도 입력이라는 기능을 가지고 있음!
→ 각각의 용도는 다르지만 입력이라는 공통된 기능명이 있음. 입력이라는 접점!
모든 필드가 묵시적(암묵적)
public static final → ex) public static final double PI = 3.141592;
(public static final) double PI = 3.141592; (묵시적)
모든 메서드가 묵시적으로 public abstract(추상메서드) ⇒ 같은 이름을 제공할 뿐이지, 상세한 기능 제공은 하지 않는다.
ex) (public abstract) void input()
// input이라는 이름을 자식에게 제공할 뿐, 상세한 기능은 자식이 알아서 오버라이딩 해라! 그런데 추상메서드니까 오버라이딩 강제화
프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것,
프로그램 에러라고도 함
- 컴파일 에러 : 프로그램의 실행을 막는 소스 코드상의 문법 에러.
소스 코드 수정으로 해결.- 런타임 에러 : 프로그램 실행 중 발생하는 에러. 주로 if문 사용으로
에러 처리- 시스템 에러 : 컴퓨터 오작동으로 인한 에러, 소스 코드 수정으로 해결 불가
예외가 발생하면 예외처리를 해서 해결 가능함
Exception과 Error 클래스 모두 Object 클래스의 자손이며 모든 예외의 최고 조상은 Exception 클래스
반드시 예외 처리해야 하는 Checked Exception과 해주지 않아도 되는 Unchecked Exception으로 나뉨
- try : Exception 발생할 가능성이 있는 코드를 안에 기술
- catch : try 구문에서 Exception 발생 시 해당하는 Exception에
대한 처리 기술
여러 개의 Exception 처리가 가능하나 Exception간의 상속 관계 고려해야 함- finally : Exception 발생 여부와 관계없이 꼭 처리해야 하는 로직 기술 중간에 return문을 만나도 finally구문은 실행되지만
System.exit();를 만나면 무조건 프로그램 종료
주로 java.io나 java.sql 패키지의 메소드 처리 시 이용
메소드 선언 시 throws Exception명을 추가하여 호출한 상위 메소드에게 처리 위임
메모리상에서 자료를 구조적으로 처리하는 방법을 자료구조라 일컫는데
컬렉션(Collection)은 자바에서 제공하는 자료구조를 담당하는 프레임워크
추가, 삭제, 정렬 등의 기능처리가 간단하게 해결 되어 자료구조적 알고리즘을 구현할 필요 없음
메모리에서 구조적으로 처리하는 방법론

- 한 번 크기를 지정하면 변경할 수 없다.
공간 크기가 부족하면 에러가 발생 🡪 할당 시 넉넉한 크기로 할당하게 됨 (메모리 낭비)
필요에 따라 공간을 늘리거나 줄일 수 없음- 배열에 기록된 데이터에 대한 중간 위치의 추가, 삭제가 불편하다.
추가, 삭제할 데이터부터 마지막 기록된 데이터까지 하나씩 뒤로 밀어내고 추가해야 함 (복잡한 알고리즘)- 한 타입의 데이터만 저장 가능하다.
- 저장하는 크기의 제약이 없다.
- 추가, 삭제, 정렬 등의 기능 처리가 간단하게 해결된다.
자료를 구조적으로 처리 하는 자료구조가 내장되어 있어 알고리즘 구현이
필요 없음- 여러 타입의 데이터가 저장 가능하다.
객체만 저장할 수 있기 때문에 필요에 따라 기본 자료형을 저장해야 하는 경우 Wrapper클래스 사용

순서 유지 O
중복 저장 O
구현 클래스로 ArrayList와 Vector, LinkedList가 있음
초기 저장 용량은 10으로 자동 설정되며 따로 지정도 가능
저장 용량을 초과한 객체들이 들어오면 자동으로 늘어나며 고정도 가능
동기화(Synchronized)를 제공하지 않음
동기화 : 하나의 자원(데이터)에 대해 여러 스레드가 접근 하려 할 때 한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것
ArrayList와 동등하지만 동기화(Synchronized)를 제공한다는 점이 ArrayList와 차이점
List 객체들 중에서 가장 성능이 좋지 않음
특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞/뒤 링크만 변경하면 되기 때문에 객체 삭제와 삽입이 빈번하게 일어나는 곳에서는 ArrayList보다 성능이 좋음
순서 유지 X
중복 저장 X
null도 중복을 허용 X 1개의 null만 저장
Set에 객체를 저장할 때 hash함수를 사용하여 처리 속도가 빠름
동일 객체 뿐 아니라 동등 객체도 중복하여 저장하지 않음
HashSet과 거의 동일하지만 Set에 추가되는 순서를 유지한다는 점이 다름
key 중복 X
value 중복 저장 O
키와 값은 모두 객체
키는 중복 저장을 허용하지 않고(Set방식), 값은 중복 저장 가능(List방식)
키가 중복되는 경우, 기존에 있는 키에 해당하는 값을 덮어 씌움
키 객체는 hashCode()와 equals()를 재정의해 동등 객체가 될 조건을 정해야 함
때문에 키 타입은 hashCode와 equals()메소드가 재정의되어 있는 String타입을 주로 사용
키 객체 만드는 법은 HashMap과 동일하나 Hashtable은 스레드 동기화가 된 상태이기 때문에,
복수의 스레드가 동시에 Hashtable에 접근해 객체를 추가, 삭제 하더라도 스레드에 안전
키와 값을 String타입으로 제한한 Map컬렉션
주로 Properties는 프로퍼티(*.properties)파일을 읽어 들일 때 주로 사용
이진 트리를 기반으로 한 Set컬렉션으로, 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성
이진 트리를 기반으로 한 Map 컬렉션으로, 키와 값이 저장된 Map.Entry를 저장하고
왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성
클래스나 메소드 내부에서 다룰 데이터의 클래스 타입을 지정하거나,
컬렉션이 다룰 클래스 타입을 제한하여 한 가지 종류의 클래스만 저장할 수 있게 한 기능
- 컴파일 단계에서 ‘잘 못 된 타입을 사용할 수 있는 문제‘ 제거
- 컬렉션에 저장된 여러 종류의 객체를 꺼내서 사용할 때,
객체의 종류에 따라 매번 형 변환을 해야하기 때문에 코드가 복잡해짐- 컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용
- API Document 해석에 어려움을 겪어 학습에 제한
타입을 파라미터로 가지는 클래스와 인터페이스 선언 시 클래스 또는 인터페이스 이름 뒤에
“< >” 부호를 붙이고 사이에는 타입 파라미터 위치
Ex)
[표현식]
클래스명<클래스타입> 레퍼런스 = new 생성자<클래스타입>();