본문 바로가기

개인 공부/하루 공부

3/23 , 3/24

* 제네릭스

- ArrayList

 

   <>

# 제네릭 : 안에 어떠한 타입을 선언해주어, ArrayList, List등이 사용할 객체 타입을 지정해준다는뜻

다룰 객체의 타입을 미리 명시해 객체의 형변환을 사용할 필요 없게함.

내가 사용하고 싶은 데이터 타입만 사용할수있게해줌

 

# 메소드 return 타입 : 자료형, void가 올수있음.

자료형이 오면 반환(returen)해주는 값이 있어야하고 void는 값이 없다

반환하고자 하는 데이터가 있다면 데이터의 자료형을 메소드의 자료형으로 적어줘야함

 

# return문: 메소드 내에서 동작하고 얻은 결과(필요한 데이터)를 반환해주는 역할을 한다. return문 뒤에는 어떠한 구문도 올 수 없다.(컴파일 에러 발생) 다르게 말하면 return문을 사용하면 값을 반환해 주고 해당 메소드는 실행이 종료된다.

 

 

#메소드 호출

 

메소드명();

 

https://gangnam-americano.tistory.com/47 참고

// 데이터 추가
pizza.add("햄피자");
pizza.add("치즈피자");
pizza.add("새우피자");
pizza.add("고구마피자");
pizza.add("불고기피자");


    // 전체 삭제
    pizza.clear();
    if(pizza.isEmpty()) {
    System.out.println("메뉴 수 : " + pizza.size());
    System.out.println("메뉴가 비었습니다.");
    }

    메뉴 수 : 0
    메뉴가 비었습니다.


		// 새롭게 메뉴 정하기
        pizza.add("페페로니피자");
        pizza.add("햄피자");
        pizza.add("불고기피자");
        pizza.add("치즈피자");
        pizza.add("파인애플치자");

        // 정렬
        Collections.sort(pizza); // 정렬하기.sort(정렬하고싶은 데이터)
        for (String s : pizza) {
            System.out.println(s);
        }
    }
}

        불고기피자
        치즈피자
        파인애플치자
        페페로니피자
        햄피자

 

문제 2)

// 피자 주재료 정보

// 치즈피자 치즈
// 햄피자 고기
// 불고기피자 고기
// 파인애플피자 파인애플
// 치즈두배피자 치즈

// 고기가 들어간 피자
// 햄피자
// 불고기피자

import java.util.ArrayList;

public class _Quiz_09_2 {
    public static void main(String[] args) {
        ArrayList<pizza> manu = new ArrayList<>();
        manu.add(new pizza ("치즈피자","치즈"));
        manu.add(new pizza ("햄피자","고기"));
        manu.add(new pizza ("불고기피자","고기"));
        manu.add(new pizza ("파인애플피자","파인애플"));
        manu.add(new pizza ("치즈두배피자","치즈"));

        System.out.println("고기가 들어간 피자");
        System.out.println("-----------------");
        for(pizza pitza : manu) {
            if (pitza.ingredient.equals("고기")){
                // == equals와 같음 (String 배열로 ==을 사용 못해서 eqales 로 적어줌)
                System.out.println(pitza.name);
            }
        }
    }
}




class pizza {
    public String name; // 메뉴이름
    public String ingredient; // 재료
    // pizza 안에 넣을 것을 생성

    // △ 둘다 선택하여 alt+insert >> con선택하고 생성자 생성
    public pizza(String name, String ingredient) {
        this.name = name;
        this.ingredient = ingredient;
        // pizza 안에 name과 ingredient 의 자리 생성
    }
}

        고기가 들어간 피자
        -----------------
        햄피자
        불고기피자

 

* 익명 클래스

- 람다식

// 람다식
// (전달값1, 전달값2, ...) -> { 코드 }


    public void pizza() {
        String p = "피자";
        System.out.println(p);
     }
     
 				▽
    () -> {
        String p = "피자";
        System.out.println(p);
     }
    }
        // 접근제어자 public 팔요없음
        // 이름  pizza 필요없음
        // 자동리턴타입 정해줌 void 필요없음
    public void print (String p) {
        System.out.println(p);
    }
//				▽
    p -> System.out.println(p)
        // 문장이 1개만있을때 {중괄호} 없어도됨
        // 문장이 1개만있을때 맨끝 세미클론; 도없어도됨
        // 전달되는값을 미리 알수있기때문에 String 생략가능
        // 전달되는값이 1개일때 () 없어도됨
    public int add (int x, int y) {
        return  x + y;
    }
    
// 			▽
    (x, y) -> x + y
    // return 사용하면 {중괄호} 생략 불가.
    // return 제거하면, {중괄호} ; 제거

 

함수형 인터페이스 미쳤나~~

 

package chap_10;

import chap_10.converter.Convertible;
import chap_10.converter.KRWConverter;

public class _04_FunctionImterface_2 {
    public static void main(String[] args) {
    
    

// 여기에 Convertible 와 KRWConverter

        // conerter 는 여기에서 만든것 (class interface 아님)
        KRWConverter converter = new KRWConverter();

//        converter.convert(2);
//        // 2달러 반환하면?

        convertUSD(public void convert (int USD) {
//            // 1 달러 = 1400 원
            System.out.println(USD + " 달러 = " + (USD * 1400) + " 원");
        }, 2);
        // △ 람다식으로 바꾸면? ▽
                convertUSD((USD) -> System.out.println(USD + " 달러 = " + (USD * 1400) + " 원"), 1);
         // public 접근제어자 필요없음
        // convert 이름 필요없음
        // void 반환형 필요없음
        // int 파라미터 자료형 필요없음
        // 한줄일때 {중괄호} 세미클론; 필요없음
        
        1 달러 = 1400 원
       // Convertible(함수형인터페이스) 이라는것에 (USD) -> System.out.println(USD + " 달러 = " + (USD * 1400) + " 원")란 동작이 정의
        Convertible convertible = (USD) -> System.out.println(USD + " 달러 = " + (USD * 1400) + " 원");
        convertUSD(convertible,1);
        // convertUSD호출
    }
        1 달러 = 1400 원



    public static void convertUSD(Convertible converter, int USD) {
        converter.convert(USD);
    }
}

△ (USD) -> System.out.println(USD + " 달러 = " + (USD * 1400) + " 원"); 라고 정의한 동작이

 

interface에 있는 Convetible한개만 있기때문에, 람다식의 동작convert(인터페이스안에있는) 동작만 됨 ▽

- 인터페이스 Convetible

package chap_10.converter;

@FunctionalInterface    // 함수형 사용을 알려줌
public interface Convertible {
    void convert (int USD);
    // △ 추상 convert 메소드 (USD로 받겠다)
}

추상메소드 (convert) 가 두개부터는 어떤메소드와 람다식이 연결되는지 알수없어 에러 발생할수있음.

 

일반적으로 코드를 봤을때, 함수형인지 일반적인 인터페이스인지 알수없기때문에 실수할수있음

@FunctionalInterface
// 이 인터페이스는 함수형 인터페이스로 쓸거라는걸 알려주는 역활

 

 

 

- 클래스 converter

package chap_10.converter;

public class KRWConverter implements Convertible {
    // implement Convertible 을 alt + enter

    @Override
    public void convert(int USD) {
        // △ 추상 convert 메소드 (USD로 받겠다)

        System.out.println(USD + " 달러 = " + (USD * 1400) + " 원");
        // 1 달러 = 1400원
    }
}



추상이란 무엇일까 | Evans Library (evan-moon.github.io)

 

추상화가된 대상은, 대상의 본질 디테일한 특징이 배제되어, 대상 자체를 표현하는 특징이 강화됨

>> 결국 어떤 복잡한 대상의 핵심적인 특징만 남기고 나머지는 제거하여 단순화시킴

 

 

* 프로그래밍에서 추상이란?

 

- 왜 필요한가?

더 복잡하고 어려운것을 만들기위해.

복잡한 구현을 감추어 단순한 형태로 표현함으로써,내가 만든 모듈이나 부품, 혹은 제품을 사용하는 사용자가 근본적인 원리를 알지 못 하더라도 대상의 기능을 활용할 수 있도록 만들어주는 것

 

ex)

동사무소에가면 주민등록 할수있다 -> 행정처리 시스템이 분업화되어 추상화됨

자동차의 엑셀러레이터를 밟으면 차가 앞으로 전진 -> 흡기/압축/폭발/배기 과정을 다루는 ECU와 엔진의 로직이 추상화됨

 

'개인 공부 > 하루 공부' 카테고리의 다른 글

4/2) 메소드 - 전달값, 반환값  (0) 2023.04.03
4/2) 삼항연산자 / if , for문의 조건문  (0) 2023.04.02
3/22  (0) 2023.03.22
3/21 공부  (0) 2023.03.21
3/19  (0) 2023.03.19