728x90

[함수형 인터페이스]

  • 함수형 인터페이스는 하나의 추상메서드가 있는 인터페이스를 말한다. (2개 이상이면 함수형 인터페이스가 아님)
  • @FunctionalInterface 어노테이션을 갖고 있다.
  • 람다식과 함께 사용된다.
  • 기본 메소드와 정적 메소드도 가질 수 있다.  
    • 기본메소드는 인터페이스의 일반적인 동작을 제공한다.
    • 정적 메소드는 인터페이스와 관련된 메소드를 제공한다. 

 

[함수형 인터페이스 사용방법]

// 함수형 인터페이스
@FunctionalInterface
public interface FunctionalInterface {
	void hi(String s);
}

// 메인 메소드
public static void main(String[] args) {

    // 익명 클래스 활용
    FunctionalInterface f = new FunctionalInterface(){
        @Override
        public void hi(String s){
            System.out.println(s);
        }
    }
    f.hi("Hi!");

     // 람다식 활용
    FunctionalInterface f1 = s -> {
        System.out.println(s);
    };
    f1.hi("Hi!");
    

}

 아직 람다식과 함수형 인터페이스에 관해 제대로 이해를 하지 못한 것 같다..(더 어떻게 설명해야할지..ㅠㅠ)  

조금 더 공부해보고 다시 정리를 해야겠다..

일단 공부한 내용은 기록으로 남겨둬야지..  

728x90

'Java' 카테고리의 다른 글

박물관 입장료 프로그램  (0) 2023.06.13
스트림(Stream)  (0) 2023.06.13
람다식(Lambda)  (0) 2023.06.13
익명 클래스  (0) 2023.06.13
커피 가게 프로그램 만들기  (0) 2023.06.12
728x90

[람다식]

람다식은 익명 함수를 지칭하는 용어이며 간결한 방법으로 함수를 정의할 수 있다.  

 

[람다식 사용방법] 

public void Phone(){
    String phone = "아이폰";
    System.out.println(phone);
}

// 방법 1
() -> {
    String phone = "아이폰";
    System.out.println(phone);
}

public void Phone(String phone){
    System.out.println(phone);
}

// 방법 2
phone -> System.out.println(phone)

public int sum (int x, int y){
    return x + y;
}

// 방법 3
(x, y) -> x + y
  • 람다식은 (전달값1, 전달값2, ...)  -> { 코드 }와 같이 사용할 수 있다.
  • 접근제어자 반환타입 메소드명은 생략 가능하다.
  • 전달값이 1개일 경우 괄호도 생략 가능하며, 전달값의 타입도 생략 가능하다. (중괄호와 세미콜론도 생략 가능)
  • return이 있을 경우 중괄호는 생략할 수 없다. (return을 제외하면 중괄호 생략 가능 자동으로 return 해줌)         
728x90

'Java' 카테고리의 다른 글

스트림(Stream)  (0) 2023.06.13
함수형 인터페이스 (Functional Interface)  (0) 2023.06.13
익명 클래스  (0) 2023.06.13
커피 가게 프로그램 만들기  (0) 2023.06.12
[Collection 프레임워크] - Iterator  (0) 2023.06.12
728x90

[익명클래스]

익명 클래스는 이름 없는 클래스라고 한다.

클래스 내에서 클래스를 정의할 수 있으며, 클래스 내부에 정의 되기 때문에 내부 클래스라고도 한다.

간단한 기능을가진 클래스를 임시로 정의하고 사용할 때 편리하고,

클래스를 따로 정의하지 않고도 필요한 동작을 구현할 수 있어 코드의 가독성과 유지보수에 편리하다는 장점이있다. 

 

[익명클래스 선언 방법] 

<방법 1>

public static void main(String[] args) {

    Phone phone = new Phone(){
        @Override
        public void type(String type){
            super.type(type);
        }
    };
    
    phone.type("아이폰");

}

class Phone{

    public void type(String type){
        System.out.println("이 휴대폰의 기종은 " + type + " 입니다.");
    }

}

    

<방법 2>

public static void main(String[] args) {

    HowToMadePasta pasta = madePasta();
    pasta.made();

    // 클래스안에서 익명 클래스 선언
    private static HowToMadePasta madePasta(){
        return new HowToMadePasta(){
            @Override
            public void made(){
                System.out.println("파스타 레시피 입니다.");
            }
        }
    }

}

// 클래스 생성 
abstract class HowToMadePasta{
	public abstract void made();
}
<부모클래스 혹은 인터페이스> 변수명 = new <부모클래스 혹은 인터페이스>() {

	// 익명 클래스 내용

} ;

위와 같이 선언하여 사용할 수 있다. 중괄호 내부에는 부모클래스 또는 인터페이스의 메서드를 오버라이드한다. 

728x90

'Java' 카테고리의 다른 글

함수형 인터페이스 (Functional Interface)  (0) 2023.06.13
람다식(Lambda)  (0) 2023.06.13
커피 가게 프로그램 만들기  (0) 2023.06.12
[Collection 프레임워크] - Iterator  (0) 2023.06.12
[Collection 프레임워크] - HashMap  (0) 2023.06.12
728x90

[문제 설명]

정수가 담긴 리스트 num_list가 주어질 때, 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 return하도록 solution 함수를 완성해주세요.

 

[입출력 예]

num_list result
[3, 4, 5, 2, 1] 1
[5, 7, 8, 3] 0

 

[차근 차근 생각해보기]

  1. num_list를 돌면서 num_list의 원소를 곱해주고 더해준다.
  2. sum은 제곱이 되어야 하기 때문에 제곱으로 만들어준 후
  3. multiple이 sum보다 작다면 1을 return하고 크다면 0을 리턴한다.  

 

[코드]

<수정 전>

class Solution {
    public int solution(int[] num_list) {
        int answer = 0;
        int multiple = 1;
        int sum = 0;
        
        for(int i : num_list){
            multiple *= i;
            sum += i;
        }
        
        sum = (int)Math.pow(sum, 2);
        
        if(multiple < sum){
            answer = 1;
        }else{
            answer = 0;
        }

        return answer;
    }
}

 <수정 후>

class Solution {
    public int solution(int[] num_list) {

        int multiple = 1;
        int sum = 0;
        
        for(int i : num_list){
            multiple *= i;
            sum += i;
        }
        
        sum = (int)Math.pow(sum, 2);
        
        return multiple < sum ? 1 : 0;
    }
}

 

[반성할 점]

이 문제는 이틀 동안 풀지 못했다..계속 오류가 나서 Intellij에서 디버그를 돌려보았고

multiple이 0이 되었다. 그럴 수 밖에 없었다.. 처음에 multiple을 선언할때 int multiple = 0;으로하였기 때문에

아무리 곱해도 0이 나올수 밖에 없었다. 그래서 multiple을 1로 초기화 한 뒤 실행해보니 잘 작동하였다.

 

하지만 불필요한 코드가 너무 많은 것 같아 어떻게 줄여볼까 생각하던 중 삼항 연산자가 생각 났다.

삼항연산자는 (조건문) ? 참 : 거짓으로 조건문이 참일 경우 참의 값이 나오고 거짓일 경우 거짓의 값이 나오는 것이다.

그래서 multiple이 sum보다 작으면 참이기 때문에 1을 return하고 거짓일 경우 0을 return 하도록 하였다.                     

728x90
728x90

[문제 설명]

'm'과 "rn"이 모양이 비슷하게 생긴 점을 활용해 문자열에 장난을 하려고 합니다. 문자열 rny_string이 주어질 때, rny_string의 모든 'm'을 "rn"으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.

 

[입출력 예]

rny_string result
"masterpiece" "rnasterpiece"
"programmers" "prograrnrners"
"jerry" "jerry"
"burn" "burn"

 

[차근 차근 생각해보기]

  1. replace함수를 사용하여 "m"을 "rn"으로 치환하기

 

[코드]

<수정 전>

class Solution {
    public String solution(String rny_string) {
        String answer = "";
        
        for(int i = 0; i < rny_string.length(); i++){
            if(rny_string.charAt(i) == 'm'){
                return rny_string.replace("m", "rn");
            }
            answer = rny_string;
        }
        return answer;
    }
}

<수정 후>

class Solution {
    public String solution(String rny_string) {
        
        return rny_string.replace("m", "rn");
        
    }
}

 

[반성할 점]

replace()는 원하는 문자를 바꾸고 싶은 문자로 바꾸는 함수이다.

굳이 반복문을 사용하지 않아도 되는데 쓸데 없는 코드를 작성하였다..

 

😓 코드가 어떻게 동작할지 차근 차근 생각해보기..     

728x90
728x90

[조건]

<카페 메뉴>
아메리카노 1000원
라떼 2000원
우유 1500원
초코라떼 3500원

<대기 손님 수 5명>
이름 : 대기번호
김자바 : 1번
이자바 : 2번
박자바 : 3번
송자바 : 4번
오자바 : 5번

 

[차근 차근 생각해보기]

  1. 메뉴판은 순서가 보장된 LinkedHashMap으로 키와 값을 넣어 준다.
  2. 반복문을 통해 키와 값을 동시에 출력해주기
  3. 손님의 정보를 담기 위한 User 클래스를 만들기 (이름과 대기번호의 정보가 들어있다.)
  4. 순서가 보장된 LinkedList로 값을 넣어주기(User 클래스의 객체로 정보를 넣어준다.)
  5. 반복을 돌면서 값 출력해주기

 

[코드]

<손님 클래스>

public class User {
    private String name;
    private int num;

    public User(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

 

<main클래스>

public static void main(String[] args) {

    LinkedHashMap<String, Integer> menu = new LinkedHashMap<>();
    menu.put("아메리카노", 1000);
    menu.put("라떼", 2000);
    menu.put("우유", 1500);
    menu.put("초코라떼", 3500);

    System.out.println("DDONY 카페 메뉴");
    System.out.println("------------------");

    for (String key : menu.keySet()) {
        System.out.println(key + " " + menu.get(key) + "원");
    }

    LinkedList<User> user = new LinkedList<>();
    user.add(new User("김자바", 1));
    user.add(new User("이자바", 2));
    user.add(new User("박자바", 3));
    user.add(new User("송자바", 4));
    user.add(new User("오자바", 5));

    System.out.println();
    System.out.println("오늘의 총 대기 고객 수 : " + user.size());
    System.out.println("카페 영업 시작합니다. ^0^");
    System.out.println();


    for (User u : user) {
        System.out.println("대기번호 " + u.getNum() + "번 " + u.getName() + " 손님 음료 준비 되었습니다.");
        System.out.println("픽업 완료 되었습니다. 감사합니다 ^0^");
        System.out.println();
    }

    System.out.println("오늘의 영업이 종료 되었습니다.");

}

 

<실행 결과>

 

 

[반성할 점]

최대한 다양한 컬렉션 프레임워크를 사용하고 싶어 map과 List를 사용해보았다.

메뉴판을 구현하는데에는 큰 어려움이 없었다. 

하지만 손님을 구현하는데 이름과 대기번호를 구현하는데 있어 너무 어려워 그냥 map으로 구현해야하나 싶었다..

 

조언을 구해본 결과 손님 클래스를 만들어 손님 정보를 만들어 주는게 맞는 방법이라고 하여 손님 클래스에 이름과 대기번호의 정보가 담길 수 있도록 만들어주었다. 그리고 add메서드에 User객체를 넣어 값을 넣어주었다.

 

손님이 음료를 픽업하고 나면 리스트에서 삭제를 해주고 싶었는데 remove()를 하니 아래와 같은 오류가 나서 그냥 remove는 빼고 구현하였다. 

다음엔 조금 더 기술을 첨가하여 제대로 된 커피숍 프로그램을 만들어봐야겠다.

 

직접 문제를 생각하고 구현해본 방식이라 어설픈게 많지만 이런식으로 여러가지 기술을 활용하여 프로그램을 몇개 만들어보아야겠다.

728x90

'Java' 카테고리의 다른 글

람다식(Lambda)  (0) 2023.06.13
익명 클래스  (0) 2023.06.13
[Collection 프레임워크] - Iterator  (0) 2023.06.12
[Collection 프레임워크] - HashMap  (0) 2023.06.12
[Collection 프레임워크] - HashSet  (0) 2023.06.12
728x90

[Iterator]

  • List / Set 과 같은 것을 순회 할 때 사용한다.
  • 처음으로 커서를 옮긴 후, 다음 한칸씩 이동 하면서 커서 위치에 있는 데이터를 가져온다.
  • 데이터를 순회하면서 필요 없는 데이터가 발견되면 그 자리에서 삭제도 가능하다.
  • 다만 단방향의 반복만가능하고 값을 변경하거나 추가가 불가능 하다는 단점이 있다.       

[Iterator 선언 방법]

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("자바");
    list.add("파이썬");

    Iterator<String> itertator = list.iterator();
}

 

[Iterator의 3가지 함수 ]

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("자바");
    list.add("X");
    list.add("파이썬");

    Iterator<String> iterator = list.iterator();

    while(iterator.hasNext()){
        String s = iterator.next();
        if (s.contains("X")) {
            iterator.remove(); // 해당 커서에 위치하는 데이터 삭제 
        }
    }

    iterator = list.iterator(); // 커서를 맨 처음으로 이동
    while(iterator.hasNext()){
        System.out.println(iterator.next()); // 다음 데이터로 이동
    }

    
}
  • iterator()를 사용하여 커서를 맨 처음으로 이동시킬 수 있다. 
  • hasNext()를 사용하여 Iterator안에 값이 있는지 확인할 수 있다.
  • remove()를 사용하여 해당 커서에 위치하는 데이터를 삭제할 수 있다.    
728x90

'Java' 카테고리의 다른 글

익명 클래스  (0) 2023.06.13
커피 가게 프로그램 만들기  (0) 2023.06.12
[Collection 프레임워크] - HashMap  (0) 2023.06.12
[Collection 프레임워크] - HashSet  (0) 2023.06.12
[Collection 프레임워크] - LinkedList  (0) 2023.06.12
728x90

[HashMap]

  • HashMap은 Map인터페이스에 속해있는 컬렉션이다. 
  • 데이터는 (Key, Value)인 1:1 구조로 이루어져 있다.  
  • 키는 고유한 속성이지만 값은 고유한 속성이 아니다.
  • 그래서 같은 키의 값을 삽입하려고 하면 해당 키의 값이 변경 된다.
  • 키는 중복이 되지 않고, 값은 중복이 될 수 있다. (null 값도 저장 가능) 

[HashMap선언 방법]

public static void main(String[] args) {
    HashMap<String, Integer> map = new HashMap<>();
    HashMap<String, String> map = new HashMap<>();
}
  •   HashMap<데이터 타입, 데이터 타입> 변수명 = new HashMap<>()으로 선언할 수 있다.  

 

[HashMap데이터 추가]

public static void main(String[] args) {
    HashMap<String, Integer> map = new HashMap<>();

    // 데이터 추가
    map.put("아메리카노", 3000);
    map.put("라떼", 4000);
}
  • put(key, value)를 사용하여 값을 추가할 수 있다.
  • 선언한 타입에 맞는 데이터만 추가할 수 있다.
  • 같은 키의 값을 추가 한다면 마지막에 넣은 vlaue로 변경된다.   

 

[HashMap데이터 조회]

public static void main(String[] args) {
    HashMap<String, Integer> map = new HashMap<>();

    // 데이터 추가
    map.put("아메리카노", 3000);
    map.put("라떼", 4000);
    
    System.out.println("아메리카노의 가격 : " + map.get("아메리카노"));
    System.out.println("라떼의 가격 : " + map.get("라떼"));
    
    // Key 확인
    for (String key : map.keySet()) {
        System.out.println(key);
    }

    // Value 확인
    for (int value : map.values()) {
        System.out.println(value);
    }
    
    // 키와 값 동시에 확인하기
    for (String key : map.keySet()) {
        System.out.println("키 : " + key + "값 : " + map.get(key));
    }
}
  • get(key)를 입력하면 key에 맞는 value가 출력 된다.
  • keyset(), values()를 사용하여 key와 vlaue를 확인 할 수 있다.

 

[HashMap데이터 삭제]

public static void main(String[] args) {
    HashMap<String, Integer> map = new HashMap<>();

    // 데이터 추가
    map.put("아메리카노", 3000);
    map.put("라떼", 4000);
    
    // 데이터 삭제
    map.remove("아메리카노");
    map.clear();
}
  • remove(key)로 key를 삭제할 수 있다.
  • clear()를 사용하여모든 키값들을 삭제할 수 있다.  

 

[HashMap크기 구하기]

public static void main(String[] args) {
    HashMap<String, Integer> map = new HashMap<>();

    // 데이터 추가
    map.put("아메리카노", 3000);
    map.put("라떼", 4000);
    
    // 크기 구하기
    System.out.println(map.size());
}
  • size()를 사용하여 크기를 구할 수 있다.
728x90
728x90

[HashSet]

HashSet은 Set 인터페이스에서 지원하는 구현 클래스이다.

HashSet의 특징은 중복을 허용하지 않고, 자동으로 중복 데이터를 제거할 수 있다.

또, 순서도 보장 되지 않는다는 특징이 있고, null도 허용한다.

 

💡순서를 보장하고 싶다면 LinkedHashSet을 사용하면 된다.  

 

[HashSet선언 방법]

public static void main(String[] args) {
	HashSet<String> set = new HashSet<>();
}
  • HashSet<데이터 타입> 변수명 = new HashSet<>()으로 선언할 수 있다.  

 

[HashSet데이터 추가]

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();

    // 데이터 추가
    set.add("자바");
    set.add("파이썬");
}
  • add()를 사용하여 값을 추가할 수 있다.
  • 지정한 타입에 맞  데이터만 추가할 수 있다.    

 

[HashSet데이터 조회]

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();

    // 데이터 추가
    set.add("자바");
    set.add("파이썬");

    // 데이터 조회
    Sysetm.out.println(set);
    for(String s : set){
        Sysetm.out.println(s);
    }
}
  • 단순 출력문을 이용하여 데이터를 출력할 수 있다. = > 결과 : [자바, 파이썬] 
  • 반복문을 이용하여 데이터를 조회할 수 있다. 

 

[HashSet데이터 삭제]

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();

    // 데이터 추가
    set.add("자바");
    set.add("파이썬");

    // 데이터 삭제
    set.remove("파이썬");
    set.clear();
}
  • remove(value)로 값을 직접 입력하여 삭제할 수 있다.
  • clear()를 사용하여 값 전체를 삭제할 수 있다.  

 

[HashSet데이터 검색하기]

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();

    // 데이터 추가
    set.add("자바");
    set.add("파이썬");

    // 데이터 검색
    if(list.contains("자바")){
        System.out.println("글자 검색하기");
    }
}
  • contains()를 사용하여 원하는 데이터를 검색할 수 있다. 

 

[HashSet크기 구하기]

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();

    // 데이터 추가
    set.add("자바");
    set.add("파이썬");

    // 크기 구하기
    System.out.println(set.size());
 }
  • size()를 사용하여 해당 리스트의 크기를 구할 수 있다.

 

728x90
728x90

[LinkedList]

  • ArrayLsit와는 다르게 각각의 노드를 연결하는 방식을 사용한다.
    • 여기서 노드란 실제로 데이터가 저장되는 그릇과 같은 것
  • 데이터를 삭제하고 추가하는 것이 용이하다.
  • 위치에 상관 없이 데이터를 삭제 및 추가 하는데 변경되는 노드만 연결해주면 된다.
  • ArrayList는 검색이 많은 경우에 사용되고, LinkedList는 데이터의 추가 / 삭제가 많을 경우 사용된다. 

(예시) 의자 없이 사람들이 손을 잡고 있는데 중간에 사람이 들어가려하면 잡고 있던 손을 놓고 그 자리로 들어갈 수 있다.

 

[LinkedList선언 방법]

 public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
 }
  • <> 안에는 Integer, String, Character, Student, Phone 등과 같은 다양한 타입이 들어 올 수 있다.  

[LinkedList데이터 추가]

 public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
    
    // 데이터 추가
    list.add("자바");
    list.add("파이썬");
    list.addFrist("C언어");
    list.addLast("자바스크립트");
 }
  • add(Object)를 사용하여 인덱스 마지막에 데이터를 추가한다.
  • add(Object, index)를 사용하여 지정한 인덱스에 값을 추가할 수 있다. 
  • addFirst()를 사용하여 첫번째에 데이터를 추가할 수 있다.
  • addLast()를 사용하여 마지막에 데이터를 추가할 수 있다. 

 

[LinkedList데이터 조회]

 public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();

    // 데이터 추가
    list.add("자바");
    list.add("파이썬");

    // 데이터 조회
    System.out.println(list.get(0));
    System.out.println(list.get(1));
    System.out.println(list.getFirst());
    System.out.println(list.getLast());
 }
  • get(index)를 사용하여 해당 인덱스의 데이터를 조회할 수 있다. 
  • getFrist()를 사용하여 첫번째 데이터를 조회할 수 있다.
  • getLast()를 사용하여 마지막 데이터를 조회할 수 있다.  
  • 반복문을 사용하여 해당 인덱스 혹은 전체 데이터를 조회할 수 있다.

 

[LinkedList데이터 삭제]

 public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();

    // 데이터 추가
    list.add(1);
    list.add(2);

    // 데이터 삭제
    list.remove(1);
    list.clear();
    list.removeFirst(); // 처음 데이터
    list.removeLast(); // 마지막 데이터
 }
  • remove()를 사용하여 인덱스 혹은 값을 직접 입력하여 삭제할 수 있다.
  • removeFirst()를 사용하여 처음 데이터를 삭제할 수 있다.
  • removeLast()를 사용하여 마지막 데이터를 삭제할 수 있다.       
  • clear()를 사용하여 값 전체를 삭제할 수 있다.  

 

[LinkedList데이터 변경]

 public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();
    
    // 데이터 추가
    list.add(1);
    list.add(2);

    // 데이터 변경
    list.set(0, 3);
    list.set(1, 5);
 }
  • set(index, Object)를 사용하여 값을 변경할 수 있다. 
  • 데이터를 변경하려면 해당 데이터의 인덱스를 알아야 한다. 

 

[LinkedList데이터 검색하기]

 public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();

    // 데이터 추가
    list.add("자바");
    list.add("파이썬");

    // 데이터 검색
    if(list.contains("자바")){
        System.out.println("글자 검색하기");
    }
 }
  • contains()를 사용하여 원하는 데이터를 검색할 수 있다. 

 

[LinkedList 크기 구하기]

 public static void main(String[] args) {
    LinkedList<String> list = new LinkedList<>();

    // 데이터 추가
    list.add("자바");
    list.add("파이썬");

    // 크기 구하기
    System.out.println(list.size());
 }
  • size()를 사용하여 해당 리스트의 크기를 구할 수 있다.
728x90

+ Recent posts