728x90

[문제]

예외 처리로 파스타 집 대기 알림 프로그램 만들기

대기 손님이 10명 이상일 경우 기다려 달라고 하기

10명 이하일 경우 입장 시키기  

 

[차근 차근 생각해보기]

  1. Excpetion 클래스를 상속받는 PleaseWait 클래스 하나 만들기
  2. customer 변수 선언하기
  3. try - catch문 사용하여 조건문과 throw문 사용해보기  
  4. finally 블록으로 감사하다는 문구 출력하기

  

[코드]

public static void main(String[] args) {
    int customer = 11;

    System.out.println("DDONY의 파스타 집 오픈!!");
    System.out.println("총 대기 인원 : " + customer + "명");
    System.out.println("----------------------");
    try {
        if(customer <= 10) {
            System.out.println("차례대로 입장 도와드리겠습니다.");
        }else{
            throw new PleaseWait("한번에 입장 가능한 최대 인원은 10명 입니다.");
        }
    }catch (PleaseWait e){
        System.out.println(e.getMessage());
        System.out.println("조금만 기다려주세요ㅠㅠ");
    }finally {
        System.out.println("\n감사합니다. 좋은 서비스 제공해드리겠습니다");
    }
}


class PleaseWait extends Exception{
    public PleaseWait(String message) {
        super(message);
    }
}

 

[반성할 점]

아직 어디서 어떻게 실전에서 사용해야할지 감이 오질 않는다..

조금 익숙해져 보려고 최대한 여러가지 방법을 사용하여 예외처리를 해보았다.  

728x90

'Java' 카테고리의 다른 글

멀티스레드(Synchronized Thread)  (0) 2023.06.15
스레드(Thread)  (0) 2023.06.15
예외처리(try-catch)  (0) 2023.06.14
박물관 입장료 프로그램  (0) 2023.06.13
스트림(Stream)  (0) 2023.06.13
728x90

[오류]

Java에서 오류는 크게 두 가지로 나눌 수 있다.

컴파일 오류와 런타임 오류이다.

 

1. 컴파일 오류

int num = "String";

코드에 문제가 있어 프로그램이 실행 되지 않은 것을 말한다. 

 

정수 타입 num에 문자열이 들어가려 하면 오류가 날 것이다.

이처럼 코드에 문제가 있어 실행이 되지 않는 것을 컴파일 오류라고 한다.  

 

2. 런타임 오류 

int[] arr = {1, 2, 3};
int arrNum = arr[3];

컴파일은 되지만 실행되는 과정에서 문제가 발생하는 것을 말한다.

 

위 코드처럼 코드에서 작성은 되지만 실행 시켜 보면 인덱스의 범위를 벗어났기 때문에

ArrayIndexOutOfBounds 오류가 날 것이다. 

 

또, 런타임 오류에는 error(에러)와 exception(예외)로 나눌 수 있다.

에러는 메모리 부족이나 스택 오버 플로우와 같은 것을 말하며 작성한 코드로 해결 할 수 없다. 

예외는 NullPointException / ArrayIndexOutOfBoundsException 같은 것들을 말하며 작성한 코드로 해결 할 수 있다.

 

[예외 처리 사용방법]

예외가 발생 하였을때 java에서는 try - catch로 예외 처리를 하거나 throw를 통해 처리할 수 있다. 

 

1. try - catch문

try{

}catch(Exception e){

}finally{

}
  • try 블록에서는 예외가 발생할 수있는 코드를 작성한다.  
  • catch 블록은 예외가 발생했을 때 실행된다. 
    • printStackTrace() 혹은 getMessage()로 에러 메세지를 확인할 수 있다.
    • catch 블록은 여러개 사용할 수 있으며
    •   ArrayIndexOutOfBoundsException, Exception 등 다양한 예외 유형을 넣어 예외 처리할 수 있다. 
  • fianlly블록은 예외가 발생해도 하지 않아도 무조건 실행되는(수행되어야 하는)  블록이다.
  • try - catch 블록은 중첩해서 사용도 가능하다.

 

2. throw 문

public static void main(String[] args) {
    try{
        System.out.println(3 / 0);
        throw new Exception("잘못된 계산 입니다.");
    } catch(ArithmeticException e){
        e.printStackTrace();
    }
}


public static num(int a, int b) throws Exception{
	// 코드..
}
  • throw는 예외를 강제로 발생시킬때 사용된다.
  • 예외가 발생할 경우, 예외 객체를 생성하고 예외를 호출자에게 던진다.
  • throw는 위와 같이 두 가지 방식으로 사용할 수 있고 catch 블록에서 예외를 다시 던질 때 사용될 수 있다.   
728x90

'Java' 카테고리의 다른 글

스레드(Thread)  (0) 2023.06.15
파스타 집 대기 알림 프로그램 만들기  (0) 2023.06.14
박물관 입장료 프로그램  (0) 2023.06.13
스트림(Stream)  (0) 2023.06.13
함수형 인터페이스 (Functional Interface)  (0) 2023.06.13
728x90

[문제]

나이가 20미만인 사람들은 무료 입장

나이가 20 이상이면 입장료 10000원을 나타내는 프로그램 만들기  

 

<이름 : 나이>

김씨: 40

이씨: 35

박씨: 20

송씨: 15

나씨 : 5

 

[차근 차근 생각해보기]

  1. 손님의 이름과 나이 정보가 있는 클래스 하나 만들기
  2. ArrayList를 사용하여 손님의 이름과 나이 정보 넣어주기
  3. 스트림을 이용하여 나이가 20 이상이면 10000원을 붙여주고    
  4. 미만이면 무료라고 표시해주기

 

[코드]

 public static void main(String[] args) {
 
    ArrayList<User> list = new ArrayList<>();
    list.add(new User("김씨", 40));
    list.add(new User("이씨", 35));
    list.add(new User("박씨", 20));
    list.add(new User("송씨", 15));
    list.add(new User("나씨", 5));

    list.stream()
            .map(x -> x.age >= 20 ? x.name + " 10000원" : x.name + " 무료")
            .forEach(System.out::println);
 
 }
 
 class User{
    public String name;
    public int age;
    
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
 }

 

[반성할 점]

User 클래스에 담겨 있는 name과 age의 정보를 어떻게 가져와야할지 몰라 한참 풀지 못하였다.

x는 User를 뜻하는 것이기 때문에 x.name과 x.age로 정보를 가져올 수 있었다.     

728x90

'Java' 카테고리의 다른 글

파스타 집 대기 알림 프로그램 만들기  (0) 2023.06.14
예외처리(try-catch)  (0) 2023.06.14
스트림(Stream)  (0) 2023.06.13
함수형 인터페이스 (Functional Interface)  (0) 2023.06.13
람다식(Lambda)  (0) 2023.06.13
728x90

[스트림]

스트림은 Java 8에서 추가된 기능으로 컬렉션 데이터를 선언형으로 쉽게 처리할 수 있다.

복잡한 반복문을 사용하지 않아도 된다.

 

많은 데이터를 원하는 조건에 따라 1차 필터링, 2차 필터링 ... 원하는 만큼 필터링을 하여 데이터를 가공할 수 있고,

데이터 중 필요한 요소만 꺼내오도록 할 수 있다.

그러기 때문에 데이터 가공이 편리하다는 이점이 있다. 

 

[스트림 생성]

public static void main(String[] args) {

    // 스트림 생성
    int[] num = {1, 2, 3, 4, 5};
    IntStream numStream = Arrays.stream(num);

    String[] str = {"A", "B", "C"};
    Stream<String> strStream = Arrays.stream(str);

    // Collection 스트림 생성
    ArryaList<String> list = new ArrayList<>();
    list = Arrays.asList("A", "B", "C");
    Stream<String> listStream = list.stream();
    
    // Stream.of()
    Stream<String> str2 = Stream.of(("A", "B", "C");
}
  • Arrays.stream을 사용하여 스트림을 생성할 수 있다.
  • Collection도 변수명.stream()을 사용하여 스트림을 생성할 수 있다.
  • Stream.of()를 통해 무자열 요소를 포함하는 스트림을 생성할 수 있다.   

 

[스트림 사용]

public static void main(String[] args) {

    // 스트림 생성
    int[] num = {10, 20, 30, 40, 50};
    IntStream numStream = Arrays.stream(num);

    // 스트림 사용
    // 30 이상만 출력
    Arrays.stream(num)
        .filter(x -> x >= 30)
        .forEach(x -> System.out.println(x));

    // 30이상인 수의 개수
    int count = (int)Arrays.stream(num)
        .filter(x -> x >= 30)
        .count(); // count는 long타입
	System.out.println(count);


    // num 배열 요소의 합
    int sum = Arrays.stream(num)
    	.sum();
    System.out.println(sum);

}

정렬 -> .sorted()

특정 글자로 시작 -> .startsWith("문자")

특정 글자 포함 -> .contains("문자") 

등의 메소드를 사용하여 데이터를 가공할 수 있다.

 

추가로 map()을사용하여 문자를 더하거나, 대소문자로 바꾸는 등 다양한 데이터 가공을 할 수 있다.       

 

728x90

'Java' 카테고리의 다른 글

예외처리(try-catch)  (0) 2023.06.14
박물관 입장료 프로그램  (0) 2023.06.13
함수형 인터페이스 (Functional Interface)  (0) 2023.06.13
람다식(Lambda)  (0) 2023.06.13
익명 클래스  (0) 2023.06.13
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

+ Recent posts