형변환
- 자동 형변환
정수 + 정수 = 정수
정수 + 실수 = 실수
3 + 0.0 = 3.0
5 / 2 = 2
5 / 2.0 = 2.5
문자 + 정수 = 정수
- 강제 형변환
(자료형)값;
예) (double)3
문자열 형변환
1. 다른 자료형을 문자열로
문자열과 다른 일반 자료형을 연결하면 결과는 문자열이 된다.
2. 문자열을 다른 자료형으로
일반 자료형은 일반 자료형끼리만 형변환이 가능하다.
문자열 타입은 클래스 타입이므로, 일반 자료형의 클래스 타입의 도움을 받아야 한다.
Integer.parseInt("") => 문자열에서 변환된 정수 값
Float.parseFloat("") => 문자열에서 변환된 실수 값
Double.parseDouble("") => 문자열에서 변환된 실수 값
===========================================================================================
입력
커서가 깜빡이고 있는 상태.
입력하기 전에 출력을 통해 어떤 값을 입력해야할지 사용자에게 알려주어야 한다.
입력 클래스
Scanner sc = new Scanner(System.in);
입력 메소드
next()
nextLine()
형변환
- 자동 형변환
정수 + 정수 = 정수
정수 + 실수 = 실수
3 + 0.0 = 3.0
5 / 2 = 2
5 / 2.0 = 2.5
문자 + 정수 = 정수
- 강제 형변환
(자료형)값;
예) (double)3
문자열 형변환
1. 다른 자료형을 문자열로
문자열과 다른 일반 자료형을 연결하면 결과는 문자열이 된다.
2. 문자열을 다른 자료형으로
일반 자료형은 일반 자료형끼리만 형변환이 가능하다.
문자열 타입은 클래스 타입이므로, 일반 자료형의 클래스 타입의 도움을 받아야 한다.
Integer.parseInt("") => 문자열에서 변환된 정수 값
Float.parseFloat("") => 문자열에서 변환된 실수 값
Double.parseDouble("") => 문자열에서 변환된 실수 값
===========================================================================================
입력
커서가 깜빡이고 있는 상태.
입력하기 전에 출력을 통해 어떤 값을 입력해야할지 사용자에게 알려주어야 한다.
입력 클래스
Scanner sc = new Scanner(System.in);
입력 메소드
next() : 사용자가 입력한 문자열 값
- 사용자가 입력한 값 중 공백 또는 줄바꿈 문자를 구분점으로 각 문자열을 분리한다.
- 첫 번째 문자열은 첫 번째 next()에 담고
두 번째 문자열은 두 번째 next()에 담는다.
nextLine() : 사용자가 입력한 문자열 값
- 공백 또는 줄바꿈 문자도 값으로 취급하기 때문에 그대로 입력받는다.
논리형(boolean)
참 : true
거짓 : false
boolean(1byte) = true, false
조건식
결과가 참 또는 거짓, 둘 중 하나가 나오는 식.
참 또는 거짓 값.
예) boolean check = 10 == 11;
관계 연산자
== : 같다
!= : 같지 않다
>, < : 초과, 미만
>=, <= : 이상, 이하
논리 연산자
&&(AND), A && B, 두 조건식 모두 참이면 참
||(OR), A || B, 둘 중 하나라도 참이면 참
단항 연산자
!(NOT), !A, 조건식이 참이면 거짓으로, 거짓이면 참으로 변경
삼항 연산자
? :, 조건식 ? 참 : 거짓, 조건식이 참이면 참, 거짓이면 거짓
예) int result = 10 > 11 ? 10 : 11;
논리형(boolean)
참 : true
거짓 : false
boolean(1byte) = true, false
조건식
결과가 참 또는 거짓, 둘 중 하나가 나오는 식.
참 또는 거짓 값.
예) boolean check = 10 == 11;
관계 연산자
== : 같다
!= : 같지 않다
>, < : 초과, 미만
>=, <= : 이상, 이하
논리 연산자
&&(AND), A && B, 두 조건식 모두 참이면 참
||(OR), A || B, 둘 중 하나라도 참이면 참
단항 연산자
!(NOT), !A, 조건식이 참이면 거짓으로, 거짓이면 참으로 변경
삼항 연산자
? :, 조건식 ? 참 : 거짓, 조건식이 참이면 참, 거짓이면 거짓
예) int result = 10 > 11 ? 10 : 11;
논리형(boolean)
참 : true
거짓 : false
boolean(1byte) = true, false
조건식
결과가 참 또는 거짓, 둘 중 하나가 나오는 식.
참 또는 거짓 값.
예) boolean check = 10 == 11;
관계 연산자
== : 같다
!= : 같지 않다
>, < : 초과, 미만
>=, <= : 이상, 이하
논리 연산자
&&(AND), A && B, 두 조건식 모두 참이면 참
||(OR), A || B, 둘 중 하나라도 참이면 참
단항 연산자
!(NOT), !A, 조건식이 참이면 거짓으로, 거짓이면 참으로 변경
삼항 연산자
? :, 조건식 ? 참 : 거짓, 조건식이 참이면 참, 거짓이면 거짓
예) int result = 10 > 11 ? 10 : 11;
삼항 연산자를 사용해야 할 때
조건식이 딱 한 개 있을 때
----------------------------------------------------------------------------------------
제어문
▶ 조건문
▷ if문
if(조건식){
실행할 문장;
}
if(조건식){
실행할 문장;
}
if(조건식){
실행할 문장;
}...
if(조건식){
실행할 문장;
}else if(조건식){
실행할 문장;
}...
}else{
실행할 문장;
}
▷ switch문
switch(변수명){
case 값1:
실행할 문장;
case 값2:
실행할 문장;
case 값3:
실행할 문장;
case 값4:
실행할 문장;
...
default:
실행할 문장;
}
▶ 반복문
▶ 반복문
▷ for문
int i = 0; i < 10; i = i + 1
for(초기식; 조건식; 증감식){
실행할 문장;
}
1. 초기식
--------
2. 조건식(true)
3. 실행할 문장
4. 증감식
5. 조건식(true)
6. 실행할 문장
7. 증감식
8. 조건식(false)
▶ 반복문
▷ for문
int i = 0; i < 10; i = i + 1
for(초기식; 조건식; 증감식){
실행할 문장;
}
1. 초기식
--------
2. 조건식(true)
3. 실행할 문장
4. 증감식
5. 조건식(true)
6. 실행할 문장
7. 증감식
8. 조건식(false)
▷ while문
while(조건식){
실행할 문장;
}
for문과 while문의 차이
- for : 몇 번 반복할 지 알 때
- while : 몇 번 반복할 지 모를 때
▷ do ~ while문
do {
실행할 문장;
} while(조건식);
무조건 한 번은 실행되어야 할 때 사용한다.
------------------------------------------------------------------------------
기타 제어문
break : 즉시 해당 중괄호 영역을 탈출한다.
- if문 안에서 사용 시 if문을 탈출하지 않고 if문을 감싸고 있는 중괄호 영역을 탈출한다.
continue : 즉시 다음 반복.
- 아래의 코드를 실행하지 않기 위해서 사용한다.
==============================================================================
배열 : 저장공간의 나열
▶ 반복문
▷ for문
int i = 0; i < 10; i = i + 1
for(초기식; 조건식; 증감식){
실행할 문장;
}
1. 초기식
--------
2. 조건식(true)
3. 실행할 문장
4. 증감식
5. 조건식(true)
6. 실행할 문장
7. 증감식
8. 조건식(false)
▷ while문
while(조건식){
실행할 문장;
}
for문과 while문의 차이
- for : 몇 번 반복할 지 알 때
- while : 몇 번 반복할 지 모를 때
▷ do ~ while문
do {
실행할 문장;
} while(조건식);
무조건 한 번은 실행되어야 할 때 사용한다.
------------------------------------------------------------------------------
기타 제어문
break : 즉시 해당 중괄호 영역을 탈출한다.
- if문 안에서 사용 시 if문을 탈출하지 않고 if문을 감싸고 있는 중괄호 영역을 탈출한다.
continue : 즉시 다음 반복.
- 아래의 코드를 실행하지 않기 위해서 사용한다.
==============================================================================
배열 : 저장공간의 나열
1.
변수를 여러 개 선언하면 이름도 여러 개 생긴다. 이 때 각 저장공간을 관리하기가 불편한다.
따라서 n칸 배열을 한 번만 선언하면 저장공간도 n개 생기고, 이름도 한 개이기 때문에 관리하기 편하다.
2.
규칙성이 없는 값에 규칙성을 부여하기 위해서
배열의 선언
자료형[] 배열명 = {값1, 값2,...}; // 어떤 값을 넣을지 알 때 사용
자료형[] 배열명 = new 자료형[칸수]; // 어떤 값을 넣을지는 모르나, 몇 칸 만들지는 알 때 사용
자료형[] 배열명 = null; // 어떤 값을 넣을지도 모르고 몇 칸 만들지도 모를 때 사용한다.
※ new: Heap 메모리에 할당, 초기값으로 자동 초기화
※ null: 주소의 초기값, 어떤 주소를 넣을 지 모를 때 작성하는 값
※ 자바에서 배열은 항상 Heap(동적 메모리)에 할당되기 때문에 메모리 상으로는 동적배열만 존재한다.
배열의 구조
int[] arData = {3, 5, 1, 2, 8};
arData라는 이름의 저장공간은 한 개 만들어지며, 여기에는 한 개의 값만 담을 수 있다.
5개의 값을 담기 위해서는 5칸이 필요하며, 이는 Heap 메모리에 할당된다. 5칸의 저장공간 중
첫 번째 저장공간의 주소값이 arData 저장공간으로 들어가며, 다음 주소에 접근하기 위해서는
+ n을 한다. 예를 들어 arData + 2는 1이라는 값이 담긴 주소값이 되며,
*(arData + 2)는 해당 주소에 가서 읽어온 1이라는 값이 된다. JAVA에서는 직접 주소에 접근하는
연산자가 없기 때문에 위와 같은 식을 []로 치환하여 사용하며, arData[2]로 사용한다.
각각의 방 번호는 index라고 부르며, 배열은 시작주소를 가지고 있기 때문에 인덱스 번호는 항상 0부터 시작된다.
▶ 반복문
▷ for문
int i = 0; i < 10; i = i + 1
for(초기식; 조건식; 증감식){
실행할 문장;
}
1. 초기식
--------
2. 조건식(true)
3. 실행할 문장
4. 증감식
5. 조건식(true)
6. 실행할 문장
7. 증감식
8. 조건식(false)
▷ while문
while(조건식){
실행할 문장;
}
for문과 while문의 차이
- for : 몇 번 반복할 지 알 때
- while : 몇 번 반복할 지 모를 때
▷ do ~ while문
do {
실행할 문장;
} while(조건식);
무조건 한 번은 실행되어야 할 때 사용한다.
------------------------------------------------------------------------------
기타 제어문
break : 즉시 해당 중괄호 영역을 탈출한다.
- if문 안에서 사용 시 if문을 탈출하지 않고 if문을 감싸고 있는 중괄호 영역을 탈출한다.
continue : 즉시 다음 반복.
- 아래의 코드를 실행하지 않기 위해서 사용한다.
==============================================================================
배열 : 저장공간의 나열
1.
변수를 여러 개 선언하면 이름도 여러 개 생긴다. 이 때 각 저장공간을 관리하기가 불편한다.
따라서 n칸 배열을 한 번만 선언하면 저장공간도 n개 생기고, 이름도 한 개이기 때문에 관리하기 편하다.
2.
규칙성이 없는 값에 규칙성을 부여하기 위해서
배열의 선언
자료형[] 배열명 = {값1, 값2,...}; // 어떤 값을 넣을지 알 때 사용
자료형[] 배열명 = new 자료형[칸수]; // 어떤 값을 넣을지는 모르나, 몇 칸 만들지는 알 때 사용
자료형[] 배열명 = null; // 어떤 값을 넣을지도 모르고 몇 칸 만들지도 모를 때 사용한다.
※ new: Heap 메모리에 할당, 초기값으로 자동 초기화
※ null: 주소의 초기값, 어떤 주소를 넣을 지 모를 때 작성하는 값
※ 자바에서 배열은 항상 Heap(동적 메모리)에 할당되기 때문에 메모리 상으로는 동적배열만 존재한다.
배열의 구조
int[] arData = {3, 5, 1, 2, 8};
arData라는 이름의 저장공간은 한 개 만들어지며, 여기에는 한 개의 값만 담을 수 있다.
5개의 값을 담기 위해서는 5칸이 필요하며, 이는 Heap 메모리에 할당된다. 5칸의 저장공간 중
첫 번째 저장공간의 주소값이 arData 저장공간으로 들어가며, 다음 주소에 접근하기 위해서는
+ n을 한다. 예를 들어 arData + 2는 1이라는 값이 담긴 주소값이 되며,
*(arData + 2)는 해당 주소에 가서 읽어온 1이라는 값이 된다. JAVA에서는 직접 주소에 접근하는
연산자가 없기 때문에 위와 같은 식을 []로 치환하여 사용하며, arData[2]로 사용한다.
각각의 방 번호는 index라고 부르며, 배열은 시작주소를 가지고 있기 때문에 인덱스 번호는 항상 0부터 시작된다.
length
배열을 선언하면 length라는 상수가 선언되고, 해당 배열의 길이가 담긴다.
배열명.length로 사용하게 된다.
배열의 사용
int[] arData = new int[5]; // 저장공간
arData[0] = 10; // 저장공간
arData[0] + 9; // 값
System.out.println(arData); // 주소값
arData[2] = arData[0] + arData[1]; // 저장공간, 값
System.out.println(arData[5]); // 오류
----------------------------------------------------------------------------------------------------
2차원 배열 : 배열 안에 배열
1차원 배열을 여러 개 선언할 때 관리하기 힘들기 때문에
2차원 배열을 한 번 선언한다.
※ 2차원 배열부터는 메모리 낭비가 심하므로 선호하지 않는다.
2차원 배열 선언
자료형[][] 배열명 = {{값1, 값2, 값3,...}, {값4, 값5, 값6,...}};
자료형[][] 배열명 = new 자료형[행][열];
자료형[][] 배열명 = null;
int[][] arrData = new int[2][3];
□ arrData arrData.length(행의 길이)
□□ arrData[행] arrData[행].length(열의 길이)
□□□ □□□ arrData[행][열]
클래스
공통요소를 한 번만 선언해놓고 가져다 사용만 하도록 설계한다.
1. 타입이다
클래스 안에 선언된 변수와 메소드를 사용하고 싶다면,
해당 클래스 타입으로 변수를 선언해야 한다.
2. 주어이다
원숭이가 먹는다 바나나를
Monkey.eat("banana");
클래스 선언
class 클래스명 {
필드(변수, 메소드)
}
클래스의 필드 사용
1. 객체화(instance) : 객체(instance variable)를 만드는 작업, 추상적인 개념을 구체화시키는 작업.
클래스명 객체 = new 생성자();
※ .(마침표): 하위 연산자, 멤버변수 접근 연산자, 닷 연산자, 점 연산자
주소값 뒤에서만 사용이 가능하며, 해당 주소를 참조하는 명령어이다.
2.
생성자
클래스 이름 뒤에 소괄호가 있는 형태, 메소드와 기능이 똑같지만 메소드라고 부르지 않는다.
생성자는 리턴이라는 기능이 존재하지 않기 때문이다.
1. 해당 클래스의 필드를 메모리에 할당한 후 부여된 주소값을 가져온다.
2. 초기화
기본 생성자
매개변수가 없는 생성자이며, 클래스 선언 시 자동으로 선언된다.
사용자가 직접 생성자를 선언하게 되면 기본 생성자는 없어진다.
상속(inheritance)
1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때
2. 여러 클래스 선언 시 필드가 겹칠 때 부모 클래스를 먼저 선언하고 공통 필드를 묶어서
자식 클래스들에게 상속해준다.
상속 문법
class A {
A 필드
}
class B extends A {
A, B 필드
}
상속(inheritance)
1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때
2. 여러 클래스 선언 시 필드가 겹칠 때 부모 클래스를 먼저 선언하고 공통 필드를 묶어서
자식 클래스들에게 상속해준다.
상속 문법
class A {
A 필드
}
class B extends A {
A, B 필드
}
A: 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스
B: 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스
super(): 부모 생성자
자식 클래스 타입의 객체로 부모 필드에 접근할 수 있다.
하지만 자식 생성자만 호출하기 때문에, 자식 필드만 메모리에 할당한다고 생각할 수 있다.
사실 자식 생성자에서 항상 부모 생성자를 호출하기 때문에 자식 생성자 호출 시 부모와 자식 필드 모두
메모리에 할당된다. 이 때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다.
만약, super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다.
다형성(polymorphism)
1. 오버로딩
2. 오버라이딩(재정의)
부모 필드에서 선언한 메소드를 자식 필드에서 수정하고자 할 때 재정의를 해야 한다.
이는 자식에서 부모 필드의 메소드와 동일한 이름으로 선언하는 것이다.
부모 필드가 메모리에 먼저 할당되고 a라는 메소드가 먼저 올라간다고 하면,
자식 필드가 메모리에 할당되면서 재정의한 a메소드가 새롭게 만들어지는 것이 아니라
기존에 할당된 a메소드 저장공간에 새롭게 재정의한 자식 필드의 소스코드 주소가 들어가게 된다.
따라서 자식 객체로 a메소드에 접근하면 자식 필드에서 재정의한 소스코드의 내용이 읽히게 된다.
상속(inheritance)
1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때
2. 여러 클래스 선언 시 필드가 겹칠 때 부모 클래스를 먼저 선언하고 공통 필드를 묶어서
자식 클래스들에게 상속해준다.
상속 문법
class A {
A 필드
}
class B extends A {
A, B 필드
}
A: 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스
B: 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스
super(): 부모 생성자
자식 클래스 타입의 객체로 부모 필드에 접근할 수 있다.
하지만 자식 생성자만 호출하기 때문에, 자식 필드만 메모리에 할당한다고 생각할 수 있다.
사실 자식 생성자에서 항상 부모 생성자를 호출하기 때문에 자식 생성자 호출 시 부모와 자식 필드 모두
메모리에 할당된다. 이 때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다.
만약, super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다.
다형성(polymorphism)
1. 오버로딩
2. 오버라이딩(재정의)
부모 필드에서 선언한 메소드를 자식 필드에서 수정하고자 할 때 재정의를 해야 한다.
이는 자식에서 부모 필드의 메소드와 동일한 이름으로 선언하는 것이다.
부모 필드가 메모리에 먼저 할당되고 a라는 메소드가 먼저 올라간다고 하면,
자식 필드가 메모리에 할당되면서 재정의한 a메소드가 새롭게 만들어지는 것이 아니라
기존에 할당된 a메소드 저장공간에 새롭게 재정의한 자식 필드의 소스코드 주소가 들어가게 된다.
따라서 자식 객체로 a메소드에 접근하면 자식 필드에서 재정의한 소스코드의 내용이 읽히게 된다.
2. static : 모든 객체가 공유해야하는 필드일 경우에 사용한다.
클래스 하나 당 한 개만 생기기 때문에 객체로 접근하지 않고 클래스로 접근한다.
※ 모든 자식은 부모 타입이다.
Casting
1. up casting
자식 값을 부모 타입으로 형변환
2. down casting
up casting된 객체를 자식 타입으로 형변환
※ 부모 값을 자식 타입으로 형변환 시 오류
다중 상속
여러 부모 클래스를 상속하는 것을 다중 상속이라고 한다.
JAVA는 모호성 때문에 다중 상속을 지원하지 않는다.
하지만 JDK8버전부터는 인터페이스에 default 메소드를 선언할 수 있으며,
여러 개를 지정할 수 있는 인터페이스 특성상 다중 상속을 지원하는 것이나 다름이 없다.
모호성(ambiguity)
하나의 자식이 여러 부모를 상속받을 때 부모 필드에 동일한 이름의 필드가 있다면,
어떤 부모의 필드인지 알 수가 없다. 이를 모호성이라고 부른다.
모호성 해결 방법
- 상황1: 두 개의 인터페이스 내에 이름과 매개변수가 똑같은 메소드가 선언되어 있다.
- 해결1: 자식 클래스에서 재정의하여 사용한다. 원하는 부모의 필드에 접근하기 위해서는 "부모명.super.필드명"을 작성한다.
- 상황2: 부모 클래스의 public 메소드와 인터페이스의 디폴트 메소드의 이름과 매개변수가 똑같이 선언되어 있다.
- 해결2: 부모 클래스의 메소드가 사용된다.
-----------------------------------------------------------------------------------------------------
다중 상속
여러 부모 클래스를 상속하는 것을 다중 상속이라고 한다.
JAVA는 모호성 때문에 다중 상속을 지원하지 않는다.
하지만 JDK8버전부터는 인터페이스에 default 메소드를 선언할 수 있으며,
여러 개를 지정할 수 있는 인터페이스 특성상 다중 상속을 지원하는 것이나 다름이 없다.
모호성(ambiguity)
하나의 자식이 여러 부모를 상속받을 때 부모 필드에 동일한 이름의 필드가 있다면,
어떤 부모의 필드인지 알 수가 없다. 이를 모호성이라고 부른다.
모호성 해결 방법
- 상황1: 두 개의 인터페이스 내에 이름과 매개변수가 똑같은 메소드가 선언되어 있다.
- 해결1: 자식 클래스에서 재정의하여 사용한다. 원하는 부모의 필드에 접근하기 위해서는 "부모명.super.필드명"을 작성한다.
- 상황2: 부모 클래스의 public 메소드와 인터페이스의 디폴트 메소드의 이름과 매개변수가 똑같이 선언되어 있다.
- 해결2: 부모 클래스의 메소드가 사용된다.
-----------------------------------------------------------------------------------------------------
함수형 인터페이스(Functional Interface)
인터페이스 중 추상메소드를 하나만 가지고 있는 인터페이스를 함수형 인터페이스라고 한다.
이 때 @FunctionalInterface를 인터페이스 위에 작성하여 단 하나의 추상 메소드만 선언할 수 있도록
제한해야 한다.
람다식(Lambda Expression)
함수형 인터페이스에서는 한 개의 추상메소드만 존재하기 때문에 구현 시 메소드 이름이 딱히 필요가 없다.
람다식은 이름이 없는 메소드로서 값처럼 사용이 가능하며, 매개변수로도 전달이 가능하다.
따라서 람다식을 익명 메소드(Anonymous Method)라고도 부른다.
람다식 문법
1. (매개변수 형식 나열, ...) -> 리턴값;
2. (매개변수 형식 나열, ...) -> { 2개 이상의 문장 작성; return 리턴값; }
※ 매개변수가 1개일 경우 소괄호 생략 가능(매개변수가 아예 없거나 2개 이상일 경우 소괄호를 반드시 작성해야 한다)
람다식 기초 실습
package는 lambdaTask1로 선언한다.
PrintName 인터페이스 선언
getFullName() 추상 메소드 선언
- 성과 이름을 전달받는다.
PrintNameTest 클래스 선언
printFullName() 메소드 선언
- 외부에서 구현된 PrintName을 전달받은 뒤 전체 이름을 출력
------------------------------------------------------------------------------------------------------
[심화 실습]
여러 개의 정수를 입력받아서 알맞는 덧셈, 뺄셈 결과를 확인하는 애플리케이션 제작
입력 예1) 7 + 35 - 9
출력 예1) 33
입력 예2) -9 + 8 + 10
출력 예2) 9
* "ABC".split("")은 [A][B][C] 3칸 문자열 배열로 리턴된다.
"A,B,C".split(",")은 [A][B][C] 3칸 문자열 배열로 리턴된다.
split("구분점")을 전달하면 문자열에서 동일한 구분점을 기준으로 문자열 값을 잘라낸 후 문자열 배열로 리턴한다.
구분점을 여러 개 사용할 때에는 split("구분점|구분점")으로 사용하며, "+", "-"를 구분점으로 사용할 때에는 "\\+", "\\-"로 표현한다.
예)"4 + 9".split("\\+")은 [4][9] 2칸 문자열 배열로 리턴
* 사용자가 정상적으로만 입력한다는 가정 하에 구현하도록 한다.
* 두 정수를 전달받은 후 int로 리턴하는 calc 추상메소드 선언(함수형 인터페이스 제작)
* 두 정수의 덧셈, 뺄셈을 구해주는 함수형 인터페이스를 리턴하는 static 메소드 선언(람다식 리턴)
* 전체 식을 전달받은 후 String[]로 리턴하는 getOpers 추상메소드 선언(함수형 인터페이스 제작)
* main메소드에 getOper를 람다식으로 구현
* 첫번째 정수가 음수일 경우 오류 해결
다중 상속
여러 부모 클래스를 상속하는 것을 다중 상속이라고 한다.
JAVA는 모호성 때문에 다중 상속을 지원하지 않는다.
하지만 JDK8버전부터는 인터페이스에 default 메소드를 선언할 수 있으며,
여러 개를 지정할 수 있는 인터페이스 특성상 다중 상속을 지원하는 것이나 다름이 없다.
모호성(ambiguity)
하나의 자식이 여러 부모를 상속받을 때 부모 필드에 동일한 이름의 필드가 있다면,
어떤 부모의 필드인지 알 수가 없다. 이를 모호성이라고 부른다.
모호성 해결 방법
- 상황1: 두 개의 인터페이스 내에 이름과 매개변수가 똑같은 메소드가 선언되어 있다.
- 해결1: 자식 클래스에서 재정의하여 사용한다. 원하는 부모의 필드에 접근하기 위해서는 "부모명.super.필드명"을 작성한다.
- 상황2: 부모 클래스의 public 메소드와 인터페이스의 디폴트 메소드의 이름과 매개변수가 똑같이 선언되어 있다.
- 해결2: 부모 클래스의 메소드가 사용된다.
-----------------------------------------------------------------------------------------------------
함수형 인터페이스(Functional Interface)
인터페이스 중 추상메소드를 하나만 가지고 있는 인터페이스를 함수형 인터페이스라고 한다.
이 때 @FunctionalInterface를 인터페이스 위에 작성하여 단 하나의 추상 메소드만 선언할 수 있도록
제한해야 한다.
람다식(Lambda Expression)
함수형 인터페이스에서는 한 개의 추상메소드만 존재하기 때문에 구현 시 메소드 이름이 딱히 필요가 없다.
람다식은 이름이 없는 메소드로서 값처럼 사용이 가능하며, 매개변수로도 전달이 가능하다.
따라서 람다식을 익명 메소드(Anonymous Method)라고도 부른다.
람다식 문법
1. (매개변수 형식 나열, ...) -> 리턴값;
2. (매개변수 형식 나열, ...) -> { 2개 이상의 문장 작성; return 리턴값; }
※ 매개변수가 1개일 경우 소괄호 생략 가능(매개변수가 아예 없거나 2개 이상일 경우 소괄호를 반드시 작성해야 한다)
람다식 기초 실습
package는 lambdaTask1로 선언한다.
PrintName 인터페이스 선언
getFullName() 추상 메소드 선언
- 성과 이름을 전달받는다.
PrintNameTest 클래스 선언
printFullName() 메소드 선언
- 외부에서 구현된 PrintName을 전달받은 뒤 전체 이름을 출력
------------------------------------------------------------------------------------------------------
[심화 실습]
여러 개의 정수를 입력받아서 알맞는 덧셈, 뺄셈 결과를 확인하는 애플리케이션 제작
입력 예1) 7 + 35 - 9
출력 예1) 33
입력 예2) -9 + 8 + 10
출력 예2) 9
* "ABC".split("")은 [A][B][C] 3칸 문자열 배열로 리턴된다.
"A,B,C".split(",")은 [A][B][C] 3칸 문자열 배열로 리턴된다.
split("구분점")을 전달하면 문자열에서 동일한 구분점을 기준으로 문자열 값을 잘라낸 후 문자열 배열로 리턴한다.
구분점을 여러 개 사용할 때에는 split("구분점|구분점")으로 사용하며, "+", "-"를 구분점으로 사용할 때에는 "\\+", "\\-"로 표현한다.
예)"4 + 9".split("\\+")은 [4][9] 2칸 문자열 배열로 리턴
* 사용자가 정상적으로만 입력한다는 가정 하에 구현하도록 한다.
* 두 정수를 전달받은 후 int로 리턴하는 calc 추상메소드 선언(함수형 인터페이스 제작) - Calc
* 두 정수의 덧셈, 뺄셈을 구해주는 함수형 인터페이스를 리턴하는 static 메소드 선언(람다식 리턴)
* 전체 식을 전달받은 후 String[]로 리턴하는 getOpers 추상메소드 선언(함수형 인터페이스 제작) - OperCheck
* main메소드에 getOpers를 람다식으로 구현 - MyMath(메인 메소드 선언)
* 첫번째 정수가 음수일 경우 오류 해결
예외 처리
컴파일 시, 빌드 시, 런타임 시 오류가 발생하면
여러가지 오류가 발생한다.
보통 오류가 발생하지 않도록 제어문을 사용하지만,
제어문을 사용할 수 없을 경우 예외 처리 문법을 사용한다.
예외 처리 문법
try{
오류가 발생할 수 있는 문장
}catch(예외이름 객체명){
오류 발생 시 실행할 문장
}...
} finally {
catch에서 잡히지 않은 오류가 있더라도 무조건 실행
}
예외 발생
직접 예외를 발생시키기 위해서는 예외 던지기를 사용해야 하며, 이 때에는 생성자 호출 전 throw 키워드를 사용한다.
예) throw new BadWordException();
사용자 정의 예외
기본적으로 제공되는 예외가 아닌 특정 상황에서 직접 예외를 만들어야 한다면, Exception 혹은
RuntimeException을 상속받아서 예외 클래스를 선언해야 한다.
Exception은 컴파일러가 체크를 하기 때문에 예외처리를 강제로 해야하고,
RuntimeException은 컴파일러가 체크하지 않기 때문에 예외처리를 선택할 수 있다.
'JAVA' 카테고리의 다른 글
Spring Boot ALL ! (0) | 2023.06.13 |
---|---|
생활코딩 js 3,4,5 (0) | 2023.05.18 |
[0201] 자바 추상 class interface (0) | 2023.02.01 |
[0131] 자바 (0) | 2023.01.31 |
[0126] 자바 class (0) | 2023.01.26 |