'Code/JAVA'에 해당되는 글 62건
람다식_2
- 클래스 멤버 (필드, 메소드) : 제약 사항 없이 사용 가능.
this -> 일반적으로 익명 객체 내부에서 this는 익명 객체의 참조지만(즉 익명 객체 생성할 때 {} 안에 변수), 람다식에선 this는 람다식을 실행한 객체의참조(전체 클래스)
- 로컬 변수 사용 : 제약 사항 있음 -> 메소드의 매개 변수 또는 로컬 변수 사용 시 final 특성 가져야 함.
why? 메소드 내에서 생성된 익명 객체는 메소드 실행 끝나도 힙 메모리에 존재. 계속 사용 가능
하지만 매개 변수나 로컬 변수는 메소드 실행이 끝나면 스택 메모리에서 사라지기 때문에 익명 개체에서 사용할 수 없어짐
-> 그래서 final로 선언하면 됨(생략 시 알아서 final로 됨) -> 알아서 읽기는 되지만 변경 안됨
ex) ulv.method(20); -> void method(int arg){
int localVar = 40; -> 여기서 arg,localVar은 변경 불가
}
- 표준 API의 함수적 인터페이스
: 자바에서 제공되는 표준 API에서 한개의 추상 메소드를 가지는 인터페이스들은 모두 람다식을 이요해 익명 구현 객체 표현 가능
EX) Thread thread = new Thread(()->{
......//실행문
}); thread.start();
- java.util.function -> Consumer : 매개값 있고 리턴값 없음
Supplier : 매개값 없고 리턴값 있음
Function : 매개값 있고 리턴값 있음 (주로 매개값을 리턴값으로 매핑(타입변환))
Operator : 매개값 있고 리턴값 있음 (주로 매개값 연산하고 결과 리턴)
Predicate : 매개값 있고 리턴값 boolean (매개값 조사해 true, false 리턴)
- 메소드 참조
: 메소드를 참조해 매개 변수의 정보 및 리턴 타입 알아내어 람다식에서 불필요한 매개 변수를 제거하는 것 목적
ex) 두 개의 값을 받아 큰 수 리턴하는 Math 클래스의 max() 정적 메소드 호출
(left, right) -> Math.max(left,right);
IntBinaryOperator operator = Math :: max; //메소드 참조한다는 의미
- 정적 메소드 : 클래스 이름 뒤에 :: 기호 붙이고 정적 메소드 이름 기술하면 됨 클래스 :: 메소
- 인스턴스 메소드 : 먼저 객체 생성한 다음 참조 변수 뒤에 :: 기호 붙이고 인스턴스 메소드 이름 기술하면 됨
ex) 참조변수 :: 메소드
- 매개 변수의 메소드 참조 : 메소드는 람다식 외부의 클래스 멤버일 수도 있고, 람다식에서 제공되는 매개변수 일수도 있다.
(a,b)->{a.instanceMethod(b);} //a 매개변수의 메소드 호출해 b 매개 변수를 매개 값으로 사용하는 경우도 음
= 클래스 :: instanceMethod
- 생성자 참고 : 메소드 참조는 생성자 참고도 포함한다. = 생성자를 참고한다는 것은 객체 생성 의미
메소드 호출로 구성된 람다식을 메소드 참조로 대치할 수 있듯이, 단순히 객체를 생성하고 리턴하도록 구성한 람다식은 생성자 참조로 대치 가능
(a,b) -> {return new 클래스(a,b);} = 클래스 :: new
-<이것이 자바다2>. 한빛미디어
'Code > JAVA' 카테고리의 다른 글
| 람다식 (0) | 2019.06.20 |
|---|---|
| 제네릭 예제_학생 성적 입출 (0) | 2019.06.20 |
| 제네릭 예제_제네릭 클래스 (0) | 2019.06.20 |
| 제네릭 예제 (0) | 2019.06.20 |
| 제네릭 (0) | 2019.06.20 |
람다식
람다식
: 함수적 프로그래밍( 병렬 처리와 이벤트 지향 프로그래밍에 적합)
자바 코드 간결해지고, 컬렉션 요소를 필터링 하거나 매핑해서 원하는 결과를 쉽게 집계 할 수 있기 때문에
- 람다식 형태 : 매개 변수를 가진 코드 블록이지만, 런타임 시 익명 구현 객체 생성
ex) Runnable runnable = new Runnable(){
public void run(매개변수){..}
}; -> 익명 구현 객체
Runnable runnable = (매개변수)-> {..}; -> 람다식 : 런타임 시 인터페이스의 익명 구현 객체로 생성
- 람다식 기본 문법 : a -> System.out.println(a); ()->{실행문;}
실행문에 return만 있을 시 (x,y)-> x+y;
- 람다식의 형태는 매개변수 가진 코드 블록. 자바의 메소드처럼 보임
-> but,자바는 메소드를 클래스의 구성 멤버로 선언하기 때문 객체 만들어서 사용
인터페이스 변수 = 람다식;
인터페이스 변수에 대입되어 사용 -> 인터페이스의 익명 구현 객체 생성함.
인터페이스는 직접 객체화할 수 없기 때문에 구현 클래스 필요 -> 그래서 람다식이 익명 구현 클래스 생성하고 객체화 함
- 타겟 타입(target type) : 대입될 인터페이스의 종류에 따라 작성 방법이 달라지기 때문에 람다식이 대입될 인터페이스를 람다식의 타겟타입이라 함
1. 함수적 인터페이스 (@Functionallterface)
: 하나의 추상 메소드가 선언된 인터페이스만 람다식의 타겟 될 수 있음. 이런 인터페이스 부르는 말
모든 인터페이스는 람다식의 타겟 타입으로 사용할 수 없음
람다식이 하나의 메소드 정의하기 때문에 두개 이상의 추상 메소드가 선언된 인터페이스는 람다식을 이용해 구현 객체 생성 불가
- @Functionallterface : 두 개 이상의 추상 메소드 선언되지 않도록 컴파일러가 체킹해주는 기능 -> 두개 이상 시 컴파일 오류 발생
2. 매개 변수와 리턴값 없는 람다식
ex) interface MyFunction{ public void method(); //메소드 없음}
MyFunction fi = ()->{...} //매개 변수 없기 때문에
fi.method(); //호출 -> 이때 {...} 익명으로 처리한 실행문들 실행 됨
3. 매개 변수가 있는 람다식
ex)interface MyFunction{ public void method(int x); //메소드 없음}
MyFunction fi = (x)->{...} or x->{...}
fi.method(5); //호출 -> 이때 {...} 익명으로 처리한 실행문들 실행 됨
4. 리턴값 있는 람다식
ex) interface MyFunction{ public void method(int x, int y); //메소드 없음}
MyFunction fi = (x,y)->{... return 값;} or (리턴값만 있을 시) (x,y) -> x+y;
fi.method(2,5); //호출 -> 이때 {...} 익명으로 처리한 실행문들 실행 됨
-<이것이 자바다2>. 한빛미디어
'Code > JAVA' 카테고리의 다른 글
| 람다식_2 (0) | 2019.06.20 |
|---|---|
| 제네릭 예제_학생 성적 입출 (0) | 2019.06.20 |
| 제네릭 예제_제네릭 클래스 (0) | 2019.06.20 |
| 제네릭 예제 (0) | 2019.06.20 |
| 제네릭 (0) | 2019.06.20 |
제네릭 예제_학생 성적 입출
학생의 성적을 저장하고 검색하고 수정하고 삭제하고 전체 출력할 수 있는 기능을 만들어
1. 추가(이름, 국,영,수)
2. 검색 (이름)
3. 수정 (이름 -> 국영수 점수 수정)
4. 삭제 (이름)
5. 전체 출력
6. 종료
* ArrayList / Vector 사용
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
public class Student {
String name;
int kor;
int eng;
int math;
public Student(String name, int kor, int eng, int math) { //매개변수 3개 받는 생성자
this.name = name;
this.kor = kor;
this.eng = eng;
this.math = math;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int total() {
return kor + math+eng;
}
public float avg() {
return (kor + math+eng);
}
@Override
public String toString() {
String str =name+" "+ kor+" "+math+" "+eng+" ";
return str;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
import java.util.ArrayList;
import java.util.Scanner;
/*
* 1. 추가(이름, 국,영,수)
* 2. 검색 (이름)
* 3. 수정 (이름 -> 국영수 점수 수정)
* 4. 삭제 (이름)
* 5. 전체 출력
* 6. 종료
*
* */
public class Grade {
arraylist <Student> st;
Grade(){
st = new arraylist<Student>(); //arraylist를 Student 클래스 타입으로 가져옴
}
static int checkIndex(Vector<Student> st2, String name) { //이름 검색 시 해당하는 학생 인덱스 찾기 위한 메소드
int index = 70;
for (int i = 0; i < st2.size(); i++) { //st 크기만큼 반복
if(st2.get(i).name.equals(name)) { //st에 저장된 이름과 입력된 이름 같을 때
index = i; //index 값으로 대입
}else index=-1;
}
return index; //반환
}
public static void main(String[] args) {
Grade g = new Grade(); //객체 선언
Scanner sc = new Scanner(System.in);
int num = 0;
do { //6입력 전까지 반복
System.out.println("1.입력 2.검색 3.수정 4.삭제 5.전체 출력 6.종료");
num = sc.nextInt();
switch(num) { //사용하는 기능을 버튼으로 받아 case로 실행
case 1: //이름과 성적 입력
System.out.println("이름, 국어, 영어, 수학 순으로 입력하세요 :");
g.st.add(new Student(sc.next(), sc.nextInt(), sc.nextInt(), sc.nextInt())); //생성자에 바로 넣기
break;
case 2: //검색 시
System.out.println("검색할 학생의 이름을 입력하세요 :");
int index = checkIndex(g.st,name); //이름과 같은 인덱스 찾기
System.out.println( g.st.toString());
break;
case 3: //수정시
System.out.println("수정할 학생의 이름을 입력하세요 : ");
int changeIndex = checkIndex(g.st,changename); //이름과 같은 인덱스 찾기
System.out.println("변경할 성적 1. 국어 2. 수학 3. 영어");
int changnum = sc.nextInt();
if(changnum== 1) {
System.out.println("변경할 점수 : ");
g.st.get(changeIndex).setKor(sc.nextInt()); //set 메소드 이용하여 값 변경
}else if(changnum == 2) {
System.out.println("변경할 점수 : ");
g.st.get(changeIndex).setMath(sc.nextInt()); //set 메소드 이용하여 값 변경
}else if(changnum== 3) {
System.out.println("변경할 점수 : ");
g.st.get(changeIndex).setEng(sc.nextInt()); //set 메소드 이용하여 값 변경
}
else System.out.println("학생이 없습니다.");
break;
case 4: //삭제 시
System.out.println("삭제할 학생의 이름을 입력하세요 : ");
String deletename = sc.next();
int deleteIndex = checkIndex(g.st,deletename); //이름과 같은 인덱스 찾기
g.st.remove(deleteIndex); //remove 이용하여 삭제
break;
case 5:
System.out.println("--------------전체 학생---------------");
for (int i = 0; i < g.st.size(); i++) {
System.out.println(g.st.get(i).toString()+ g.st.get(i).total() + " "+g.st.get(i).avg()); //toString 이용하여 전체 성적 출력
}
break;
}
}while(num != 6);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
제네릭 예제_제네릭 클래스
클래스를 제네릭으로 받는 예제
제네릭 클래스 객체 생성과
클래스 객체 생성에 대해 알아볼 수 있다.



'Code > JAVA' 카테고리의 다른 글
| 람다식 (0) | 2019.06.20 |
|---|---|
| 제네릭 예제_학생 성적 입출 (0) | 2019.06.20 |
| 제네릭 예제 (0) | 2019.06.20 |
| 제네릭 (0) | 2019.06.20 |
| 멀티 스레드 예제_ATM(Synchronized) (0) | 2019.06.20 |
제네릭 예제
Box를 제네릭 타입으로 하여 출력 예제


'Code > JAVA' 카테고리의 다른 글
| 제네릭 예제_학생 성적 입출 (0) | 2019.06.20 |
|---|---|
| 제네릭 예제_제네릭 클래스 (0) | 2019.06.20 |
| 제네릭 (0) | 2019.06.20 |
| 멀티 스레드 예제_ATM(Synchronized) (0) | 2019.06.20 |
| 멀티 스레드 예제_priority (0) | 2019.06.20 |
제네릭
제네릭 : 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 됨
컬렉션, 람다식, 스트림, NIO 에서 널리 사용.
클래스와 인터페이스, 메소드 정의할 때 타입을 파라미터로 사용할 수 있도록 함
1. 컴파일 시 강한 타입 체크 할 수 있음
: 자바 컴파일러는 코드에서 잘못 사용된 타입때문에 발생하는 문제점을 제거하기 위해 제네릭 코드에 대해 강한 타입 체크 함
실행 시 타입 에러 나는 것보다 미리 타입을 강하게 체크해서 에러 사전에 방지
2. 타입 변환(casting)을 제거 : 비제네릭 코드는 불필요한 타입 변환을 하기 때문에 성능 저하
ex) List list = new ArrayList();
list.add("hello");
String src = (String) list.get(0); //casting 해야 함
-> List list = new ArrayList();
list.add("hello");
String str = list.get(0); //casting 안함
* 제네릭 타입 사용하면 같은 타입의 데이터 타입을 클래스 내에서 쓰면 굳이 타입 정함 필요없이 자유롭게 쓸 수 있어서
- 제네릭 타입(class, interface)
: 타입을 파라미터로 가지는 클래스와 인터페이스. <> 부호 안에 파라미터 위치
- 파라미터 : 변수명과 동일한 규칙 따라 작성 할 수 있지만, 일반적으로 대문자 알파벳 한 글자로 표현
- 멀티 타입 파라미터(class<K,V...), interface<K,V..>) : 제네릭은 두 개 이상의 멀티 타입의 파라미터 사용. ,로 구분
ex) public class Product<T,M> {
private T kind;
private M model; ......
}
main() -> Product<Tv, String>
- 제네릭 메소드 (<T,R> R method(T t))
: 매개 타입과 리턴 타입으로 타입 파라미터 갖는 메소드를 말함.
리턴 타입 앞에 <> 추가해 타입 파라미터를 기술하여, 리턴 타입과 매개 타입으로 타입 파라미터 사용
ex) class Util{
public static Box boxing(T t){
Box box = new Box();
box.set(t);
return box;
}} -> 호출 : main() Box box1 = Util.boxing(100);
int intValue = box1.get();
- 제한된 타입 파라미터 ()
: 타입 파라미터에 지정되는구체적인 타입을 제한할 필요가 종종 있음.
예를 들어 숫자 연산할 때 Number or 하위 클래스 타입만 들어가야함
- 와일드카드 타입 :
<?> : 제한 없음. 타입 파라미터를 대치하는 구체적인 타입으로 모든 클래스나 인터페이스 타입이 올 수 있음
<? extends ...> : 상위 클래스 제한. 타입 파라미터를 대치하는 구체적인 타입으로 상위 타입이나 하위 타입만 올 수 있음
<? super...> : 하위 클래스 제한. 타입 파라미터를 대치하는 구체적인 타입으로 하위 타입이나 상위 타입이 올 수 있음
- 제네릭 타입의 상속 : public class ChildProduct<T,M> extends Product<T,M> {...}
- 제네릭 타입의 구현 : public interface Storage {..}
public class StorageImple implements Storage{...}
* 제네릭 타입 구현으로 클래스 배열 만들어 클래스 객체 생성하기 가능
-<이것이 자바다1>. 한빛 미디어
'Code > JAVA' 카테고리의 다른 글
| 제네릭 예제_제네릭 클래스 (0) | 2019.06.20 |
|---|---|
| 제네릭 예제 (0) | 2019.06.20 |
| 멀티 스레드 예제_ATM(Synchronized) (0) | 2019.06.20 |
| 멀티 스레드 예제_priority (0) | 2019.06.20 |
| 멀티 스레드 예제_yield (0) | 2019.06.20 |
멀티 스레드 예제_ATM(Synchronized)
엄마와 아들이 ATM을 통하여 1000원씩 꺼내갈려고 한다.
한 쪽만 독점하지 않고 서로 돌아가면서 뽑을려면 스레드를 잘 써야한다.
동기화(Synchronized)
: 보내고 받는 영역이 서로 okay 되면 전송하고 받음
임계 영역을 지정하기 위해 동기화 메소드와 동기화 블록 제공 -> 스레드 내부에 동기화 존재 시 객체 잠금 걸어 다른 스레드가 임계 영역 코드를 실행하지 못함
synchronized -> 인스턴스, 정적 메소드 어디든 가능
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
class ATM implements Runnable {
private long depositeMoney = 10000;
public void run() {
synchronized (this) { //동기화 사용하기 위해
for (int i = 0; i < 10; i++) {
try {
notify(); //실행 대기 상태로
Thread.sleep(1000);
} catch (InterruptedException e) {e.printStackTrace(); }
if (getDepositeMoney() <= 0) //여기서 wait()으로 잠들기 전에 금액 -되면 break로 나갈 수 있도록
break;
try {
wait(); //if에서 안걸리면 wait(), 걸리면 나갈 수 있도록
} catch (InterruptedException e1) {e1.printStackTrace();}
//일시 정지 상태로
withDraw(1000);
}
}
}
public void withDraw(long howMuch) {
if (getDepositeMoney() > 0) {
depositeMoney -= howMuch;
System.out.print(Thread.currentThread().getName() + " , ");
System.out.print("잔액 : "+ getDepositeMoney()+"\n");
} else {
System.out.print(Thread.currentThread().getName() + " , ");
System.out.println("잔액이 부족합니다.");
}
}
public long getDepositeMoney() {
return depositeMoney;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|

'Code > JAVA' 카테고리의 다른 글
| 제네릭 예제 (0) | 2019.06.20 |
|---|---|
| 제네릭 (0) | 2019.06.20 |
| 멀티 스레드 예제_priority (0) | 2019.06.20 |
| 멀티 스레드 예제_yield (0) | 2019.06.20 |
| 멀티 스레드 예제_join() (0) | 2019.06.19 |
멀티 스레드 예제_priority
우선 순위 방식
: 우선 순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링 하는 것
-> 우선 순위 번호 부여할 수 있기 때문에 개발자가 코드로 제어 가능
1 - 10까지 부여되는데 1 : 제일 낮음. 우선 순위 부여 X 이면 기본적으로 5의 우선순위 할당
thread.setPriority() 메소드 : 우선순위 변경 가능


'Code > JAVA' 카테고리의 다른 글
| 제네릭 (0) | 2019.06.20 |
|---|---|
| 멀티 스레드 예제_ATM(Synchronized) (0) | 2019.06.20 |
| 멀티 스레드 예제_yield (0) | 2019.06.20 |
| 멀티 스레드 예제_join() (0) | 2019.06.19 |
| 멀티 스레드 예제_BeepThread (0) | 2019.06.19 |
멀티 스레드 예제_yield
- yield() : 실행 중 우선순위 동일한 다른 스레드에게 실행 양보하고 실행 대기 상태가 됨



'Code > JAVA' 카테고리의 다른 글
| 멀티 스레드 예제_ATM(Synchronized) (0) | 2019.06.20 |
|---|---|
| 멀티 스레드 예제_priority (0) | 2019.06.20 |
| 멀티 스레드 예제_join() (0) | 2019.06.19 |
| 멀티 스레드 예제_BeepThread (0) | 2019.06.19 |
| 멀티 스레드_5 (0) | 2019.06.19 |
멀티 스레드 예제_join()
- join() : join() 메소드 호출한 스레드는 일시 정지 상태.
실행 대기 상태로 갈려면 join() 메소드를 멤버로 갖는 스레드가 종료 되거나 매개값으로 주어진 시간 지나야 함
계산을 다 마친 후 값을 가져와야 하는 경우. 다른 스레드의 종료를 기다렸다가 실행해야 하는 경우

Runnable 통해 구현
클래스 자체 객체로 만들기 (Thread th = new Thread(new JoinTest());)
@override 되어 run() 메소드 정
join을 통해 스레드 작업을 연장시켜 'end' 출력을 지연시킴
'Code > JAVA' 카테고리의 다른 글
| 멀티 스레드 예제_priority (0) | 2019.06.20 |
|---|---|
| 멀티 스레드 예제_yield (0) | 2019.06.20 |
| 멀티 스레드 예제_BeepThread (0) | 2019.06.19 |
| 멀티 스레드_5 (0) | 2019.06.19 |
| 멀티 스레드_4 (0) | 2019.06.19 |