'Code/JAVA'에 해당되는 글 62건

Code/JAVA

람다식_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
Code/JAVA

람다식

반응형


람다식 

: 함수적 프로그래밍( 병렬 처리와 이벤트 지향 프로그래밍에 적합)
자바 코드 간결해지고, 컬렉션 요소를 필터링 하거나 매핑해서 원하는 결과를 쉽게 집계 할 수 있기 때문에

 

- 람다식 형태 : 매개 변수를 가진 코드 블록이지만, 런타임 시 익명 구현 객체 생성
        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
Code/JAVA

제네릭 예제_학생 성적 입출

반응형

 

학생의 성적을 저장하고 검색하고 수정하고 삭제하고 전체 출력할 수 있는 기능을 만들어

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("검색할 학생의 이름을 입력하세요 :");
                String name = sc.next();
                int index = checkIndex(g.st,name);                    //이름과 같은 인덱스 찾기
                System.out.println( g.st.toString());
                
                break;
            case 3:                                                    //수정시
                System.out.println("수정할 학생의 이름을 입력하세요 : ");
                String changename = sc.next();
                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' 카테고리의 다른 글

람다식_2  (0) 2019.06.20
람다식  (0) 2019.06.20
제네릭 예제_제네릭 클래스  (0) 2019.06.20
제네릭 예제  (0) 2019.06.20
제네릭  (0) 2019.06.20
Code/JAVA

제네릭 예제_제네릭 클래스

반응형

 

클래스를 제네릭으로 받는 예제 

제네릭 클래스 객체 생성과 

클래스 객체 생성에 대해 알아볼 수 있다.

 

반응형

'Code > JAVA' 카테고리의 다른 글

람다식  (0) 2019.06.20
제네릭 예제_학생 성적 입출  (0) 2019.06.20
제네릭 예제  (0) 2019.06.20
제네릭  (0) 2019.06.20
멀티 스레드 예제_ATM(Synchronized)  (0) 2019.06.20
Code/JAVA

제네릭 예제

반응형

 

 

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
Code/JAVA

제네릭

반응형


제네릭 : 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 됨 

   컬렉션, 람다식, 스트림, 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
Code/JAVA

멀티 스레드 예제_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
Code/JAVA

멀티 스레드 예제_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
Code/JAVA

멀티 스레드 예제_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
Code/JAVA

멀티 스레드 예제_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

푸터바

태그

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

  • Today :
  • Yesterday :
  • Total :