본문 바로가기

WINK-(Web & App)/JAVA 스터디

[2024-2 Java 스터디] 이민형 #2주차 (3~4장)

반응형

 

자바를 "자바라" (Java "java")

 

 

3. Java의  자료형을 알아보자


 

 

 

맵은 대응관계를 쉽게 표현해줄 수 있는 자료형이다.

맵은 사전을 떠올리면 쉽게 이해할 수 있다. 

 

맵에는 'key'와 'value'가 존재한다.

우리가 사전을 보게 되면 apple -> 사과, banana -> 바나나 인 것 처럼

key에 할당된 value 값이 저장돼있는 것이다.

 

 

 

맵에서 사용할 수 있는 여러가지 메서드를 한번 알아보자

 

put 메서드는 우리가 사전을 만드는 것과 같이 key와 value값을 추가할 수 있다.

import java.util.HashMap;

public class Sample {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("apple", "사과");
        map.put("banana", "바나나");
    }
}
Hashmap은 맵 자료형 중 가장 기본적인 자료형이다.  import java.util.HashMap; 문을 작성해야 사용할 수 있다.

 

 

넣는 게 있다면 빼는 것도 있는 법.

key에 해당하는 value값을 얻고자 할 때 우리는 get 메서드를 사용한다.

import java.util.HashMap;

public class Sample {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("apple", "사과");
        map.put("banana", "바나나");
        System.out.println(map.get("apple")); // "사과" 출력
    }
}
key에 해당하는 value값이 없다면 null이 출력된다.
get 이외에도 containskey(), remove(), size()가 적용될 수 있다.

 

 

keySet 메서드는 맵 안에 있는 모든 key값을 집합 자료형으로 리턴한다.

import java.util.HashMap;

public class Sample {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("apple", "사과");
        map.put("banana", "바나나");
        System.out.println(map.keySet());  // [apple, banana] 출력
    }
}
알다시피 집합 자료형은 리스트 자료형으로 손 쉽게 변환할 수 있다.

 

 

집합

 

집합(set) 자료형에는 Hashset, TreeSet, LinkedHashSet 등이 있는데

우리는 가장 흔하게 사용되는 Hashset에 대해서 알아보도록 할 것이다.

import java.util.Arrays;
import java.util.HashSet;

public class Sample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>(Arrays.asList("H", "e", "l", "l", "o"));
        System.out.println(set);  //  [e, H, l, o] 출력
    }
}

 

위는 HashSet의 예시이다.

배열과 리스트는 순서가 있다.

 

근데 위와 같이 집합으로 형변환을 하면 이상한 출력 값이 나온다.

이상한 건 아니다. 컴퓨터는 거짓말을 하지 않는다.

 

집합에는 큰 2가지 특징이 있다.

하나. 순서가 없다.

둘. 중복을 허용하지 않는다.

 

당신이 바람직한 컴퓨터족이라면
'중복을 허용하지 않는다' 라는 말에서 집합을 필터로 사용할 수 있겠다는 생각이 들어야한다.
사실 들지 않아도 된다.

 

집합이기 때문에 당연히 교집합, 합집합, 차집합을 구할 수 있다.

교집합을 구할 때는 retainAll() 메서드를,

합집합을 구할 때는 addAll() 메서드를,

차집합을 구할 때는 removeAll() 메서드를 사용한다.

 

집합에 새로운 값을 추가하려면 add 메서드를 사용하면 된다.

import java.util.HashSet;

public class Sample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("My");
        set.add("Name");
        set.add("Lee");
        System.out.println(set);  // [Lee, Name, My] 출력
    }
}
이렇게 일일이 하나 하나 추가하는 것이 귀찮다면 addAll 메서드를 사용해 한꺼번에 추가할 수 있다.
참고로 합집합을 구할 때도 addAll 메서드를 사용했다.
특정 값을 제거하고 싶다면 눈치챘겠지만 remove 메서드를 사용하면 된다.

 

 

 

상수 집합

 

 

집합에 대해 알아보았으니 그럼 상수집합에 대해 알아보자.

상수집합 자료형은 enum이라고 한다.

 

점프 투 자바의 예시로 3가지 종류의 커피를 갖고 있다고 가정하자.

enum CoffeeType {
    AMERICANO,
    ICE_AMERICANO,
    CAFE_LATTE
};

이렇게 하면 3가지 종류의 커피가 들어있는 CoffeeType이라는 상수집합을 만들 수 있다.

 

그럼 굳이 enum, 상수집합을 사용하는 이유는 무엇일까?

 

우리가 CoffeType이라는 상수집합을 만들었고 그 종류는 AMERICANO, ICE_AMERICANO, CAFE_LATTE 3가지이다.

만약 카페에서 베스트셀러는 AMERICANO라고 가정을 하자.

나는 bestSeller라는 변수에 AMERICANO를 할당하고 싶어한다.

 

CoffeeType bestSeller = AMERICANO; // 올바른 값
bestSeller = AMERICANO; // 올바른 값
bestSeller = 7; // 잘못된 값, 컴파일 에러 발생!

 

그럼 이렇게 내가 만든 상수집합의 타입 변수 bestSeller를 만들면 된다.

bestSeller라는 변수는 CoffeeType이라는 type이기 때문에 다른 종류의 타입이 들어갈 수 없다.

만약 마지막처럼 7이 된다면 컴파일 에러가 발생한다!!

자 이제 enum을 왜 쓰는지 잘 알겠지? 넌 아직 복잡한 코드를 쓰는 건 아니잖냐 나중가면 필요할 것이야.

 

 

 

형 변환 그리고 final

 

 

자 이제 형변환과 final 키워드를 알아보자

형변환은 말 그대로 자료형을 변환해주는 것이다.

String num = "123";

이런 경우에 형변환이 가능하다.

문자열 자료형이지만 숫자로 이루어져있기 때문에 Integer로 바꾸는 것을 시도해볼 수 있다.

public class Sample {
    public static void main(String[] args) {
        String num = "123";
        int n = Integer.parseInt(num);
        System.out.println(n);  // 123 출력
    }
}
마찬가지로 정수를 문자열로 바꾸는 것도 가능하다. String으로 직접 지정해주는 것도 가능하지만!
String

num = "" + n;  이렇게 빈 문자열에 정수를 더해주는 것만으로도 형변환이 가능하다.

참고로 Double.parseDouble 이나 Float.parseFloat도 가능하다.

 

 

final 키워드는 자료형에 값을 딱 한 번만 설정할 수 있게하는 키워드이다.

public class Sample {
    public static void main(String[] args) {
        final int n = 123;  // final로 설정하면 값을 바꿀 수 없다.
        n = 456;  // 컴파일 오류 발생
    }
}
List의 경우도 final 키워드의 적용이 가능하다.

 

 

 

 

4. 제어문을 제어하라


 

 

 

 

 

if문

 

 

드디어 제어문이다. 코딩의 꽃이라고 할 수 있다.

우리에게 정말 익숙한 if문을 알아보겠다.

boolean money = true;
if (money) {
    System.out.println("술을 마신다");
}else {
    System.out.println("집에 가라");
}

 

만약 돈이 있다고 한다면 money에 true를 담는다.

money에 담긴 값이 참이기 때문에 이 if문은 "술을 마신다"를 출력하게 된다.

 

이 if문은 만약 돈이 있다면 "술을 마신다"를 출력하고

돈이 없다면 "집에 가라"를 출력하는 코드이다.

 

 

그렇다 if문에 들어간 값이 참이면 if문에 속한 명령을 수행한다.

int money = 2000;
if (money >= 3000) {
    System.out.println("술을 마신다");
}else {
    System.out.println("집에 가라");
}

위 코드를 한번 살펴보자.

아까와 다르게 money는 boolean이 아니라 int 자료형이다.

만약 money가 3000이상이라면 if문의 명령을 수행하는 코드이다. 물론 그렇지 않으면 else 명령을 수행한다.

 

 

'money >= 3000' 이 문쟁을 우리는 조건문이라고 한다.

조건문이 참이 되기 때문에 명령을 수행하는 것이다.

이 코드는 "집에 가라"를 출력한다. 이걸 보는 사람들은 술자리를 줄이고 집에 가서 공부를 하도록 하자.
맨날 술만 마시며 한 번 사는 인생, 재밌는 인생, 행복을 추구하고, 행복하고 싶다는 핑계를 대며 그러지 않도록 하자.
그렇게 해서 행복해질 인생이면 누가나 다 띵가 띵가 논다.
인간은 절대로 항상 행복하고 만족하며 살 수 없다.

 

 

 

contains 메서드는 리스트 자료형에 해당 값이 있는지를 조사하는 메서드다,

contain 메서드는 조건문에 사용 될 수 있는데, 다음 코드를 보자.

ArrayList<String> pocket = new ArrayList<String>();
pocket.add("paper");
pocket.add("handphone");
pocket.add("money");

if (pocket.contains("money")) {
    System.out.println("술을 마신다");
}else {
    System.out.println("집에 가라");
}

나는 주머니라는 스트링을 하나 만들었다.

저기 있는 "paper", "handphone", "money"는 리스트의 요소이자 내 주머니에 있는 것들이다.

저렇게 리스트에 "money"가 있는지 확인이 되면 "술을 마신다"를 출력한다.

 

 

 

만약 판단해야할 조건이 단 하나라면 상관 없지만

여러개일 때 우리는 else if라는 것을 사용한다.

if (조건문) {
    <수행할 문장1> 
    <수행할 문장2>
    ...
}else if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
}else if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
...
} else {
   <수행할 문장1>
   <수행할 문장2>
   ... 
}

이렇게 else if 문은 이전 조건문이 거짓이어야만 실행된다.

 

 

switch/case 문

 

switch(입력변수) {
    case 입력값1: ...
         break;
    case 입력값2: ...
         break;
    ...
    default: ...
         break;
}

이건 switch/case 문이다.

입력변수의 값과 입력값n이 동일하다면 case문의 명령을 실행한다.

그리고 다음 case는 확인할 필요가 없기 때문에 break; 문으로 탈출시켜준다.

 

 

while문

 

 

while문이라는 것은 다들 많이 들어봤을 것이다. 일단 그 구조를 보자.

while (조건문) {
    <수행할 문장1>;
    <수행할 문장2>;
    <수행할 문장3>;
    ...
}

딱 보이는대로 조건문일 동안 문장들을 수행하는 것이다.

 

 

int treeHit = 0;
while (treeHit < 10) {
    treeHit++;  // treeHit += 1 로도 표현 가능
    System.out.println("나무를  " + treeHit + "번 찍었습니다.");
    if (treeHit == 10) {
        System.out.println("나무 넘어갑니다.");
    }
}

treeHit 변수를 0으로 일단 지정하고 treeHit 변수가 10보다 작을 동안만 이 코드를 실행한다

안다 이 코드는 매우 쉽다. 근데 잘 보자 그래도.

 

만약 treeHit의 값이 10이 된다면 문장을 출력하고 if 문의 조건이 참이 되어 "나무 넘어갑니다."를 출력하고!!!!

그리고 다시 while문 위로 올라가 10보다 작다는 조건을 만족시키지 못하기 때문에 while문을 탈출하게 된다.

점프 투 자바의 예시를 가져왔다. 너무 좋더라구.

 

 

 

int coffee = 10;
int money = 300;

while (money > 0) {
    System.out.println("돈을 받았으니 커피를 줍니다.");
    coffee--;
    System.out.println("남은 커피의 양은 " + coffee + "입니다.");
    if (coffee == 0) {
        System.out.println("커피가 다 떨어졌습니다. 판매를 중지합니다.");
        break;
    }
}

 이 예시도 한 번 살펴보자.

일단 (money > 0)은 항상 참인 상태.

 

if문 조건을 만족하지 못한 상태로 계속 coffee의 개수가 줄다가 coffee의 값이 0이 되면

저 문장을 출력하고 break; 문으로 인해 while문을 탈출하게 된다.

 

근데 근데 만약 break가 없다면? 

다시 while문 위로 올라가게 될 것이고 coffee의 값은 음수가 되며 if문을 충족시키지 못한 채로 계속 무한루프를 돌 것이다.

무한루프ㅋㅋㅋㅋ

 

 

 

그대는 break와 continue의 차이를 아는가?

 

break는 그 제어문은 완전히 종료시켜버린다.

그러나 continue는 그 조건을 건너뛰어버린다.

 

그러니 종료가 아니라 마치 건너뛰기 같은 개념인 것이다.

 

 

 

for 문

 

 

 

for문도 마찬가지로 무언가를 반복할 때 사용한다.

for (초기치; 조건문; 증가치) {
    ...
}

for문의 구조는 대강 이렇다.

초기치를 설정하고 그에 맞는 조건문을 설정하고 초기치의 값을 점차 바꿔주는 증가치를 설정한다.

 

 

String[] numbers = {"one", "two", "three"};
for(int i=0; i<numbers.length; i++) {
    System.out.println(numbers[i]);
}

이 코드를 살펴보면 i의 초기값은 0 이다 그리고 배열의 길이보다 i가 작을 때 실행된다.

이 코드의 순서는 일단 i가 조건문에 충족하면 명령문을 실행한 다음에 증가치를 할당한다.

 

이중 for문은 for문을 이중으로 출력하는데 구구단 느낌이라고 생각하면 된다.

 

 

 

for each 문

 

 

 

for each 문을 알아보도록 하자.

String[] numbers = {"one", "two", "three"};
for(String number: numbers) {
    System.out.println(number);
}

numbers 라는 String배열을 만들었다.

저 for문의 의미는 numbers에 있는 요소를 number에 하나씩 대입하는 것이다.

간단하다. 

 

 

 

어렵다.........

 

 

 

 

 

Quiz

 

 

 

1.다음 중 HashMap의 특징은?

 

답: null 키를 허용한다.

 

 

 

 

2.Map에서 키-값 쌍을 추가할 때 사용하는 메서드는?

 

답: put()

 

 

3.다음 코드의 출력 결과는 무엇인가?

 

답: 8

 

 

 

4.Map에 키가 존재하는지 여부를 알 수 있는 메서드는?

 

답: containsKey()

 

 

 

5.Set의 주요 특징 중 하나는 무엇인가?

 

답: 중복된 요소를 허용하지 않는다.

 

 

 

6.다음 코드의 출력 결과는 무엇인가?

 

답: 1

 

 

7.Set에 요소를 추가할 때 사용하는 메서드는?

 

답: add()

 

 

 

8.Java에서 자동 형 변환(implicit casting)이 이루어지는 경우는?

 

답: int에서 double로 변환할 때

 

 

 

9.다음 코드의 출력 결과는 무엇인가?

 

답: 9

 

 

 

10.다음 중 final 키워드의 올바른 사용법이 아닌 것은?

 

답: final 변수를 재할당할 수 있다.

 

 

 

11.Java에서 기본형 타입을 참조형 타입으로 변환할 때 사용하는 클래스는?

 

답: Wrapper

 

 

 

12.다음 코드의 출력 결과는 무엇인가?

 

답: 10 에러인가? 모르게썰

 

 

 

13.Java의 Set 인터페이스를 사용하는 목적에 대해 서술하시오.

 

답: Set은 이제 주로 중복 되는 값을 손 쉽게 삭제할 때 사용한다.

 

14.형 변환(타입 캐스팅)의 개념을 설명하고, 자바에서의 자동 형 변환과 수동 형 변환의 차이점을 서술하시오.

 

답: 형변환이란 어떤 변수를 기존 타입에서 다른 타입으로 변경해주는 것을 말함.

 

자동 형 변환은 기존 타입의 변수를 다른 타입 변수로 지정해도 에러가 발생하지 않는다는 것.

얘를 들어 byte a =10; int b = a;

요래도 되는거.

 

근데 수동 형 변환은 저게 안돼서 강제로 변경 시키는 거임.

 

14.Java의 final 키워드에 대해 설명하고, final 변수를 사용할 때의 장점을 서술하시오.

 

답: 만약 final 키워드를 사용하게 되면 그 자료형에는 값을 딱 한 번만 설정할 수 있다.

그니까 내가 어떤 값을 지정하고 그 값을 계속 유지하고 싶을 때 값이 바뀌는 것을 막기 위해 사용하면 유용하다.

 

15.형 변환 시 발생할 수 있는 예외 상황에 대해 설명하고, ClassCastException이 발생하는 경우를 예로 들어 설명하시오.

 

답: 예를 들어 실수 형태의 문자열을 정수로 바꾸고 싶을 때는 바로 정수로 바꿔버리면 안된다.

실수로 한 번 바꿔주고 정수로 바꿔주어야한다.

ClassCastException은 객체의 실제 타입과, 형 변환하려는 타입이 맞지 않기 때문에 발생한다.

 

 

 

 

 

 

1.다음 코드의 출력 결과는 무엇인가?

 

답: A

 

 

 

2.다음 중 if 문의 올바른 사용법은?

 

답: b)

 

 

 

3.다음 중 중첩 if 문의 예는?

 

답: a)

 

 

 

4.다음 if-else if-else 구조에서 result의 값은 무엇인가?

 

답: B

 

 

 

5.다음 if 문에서 논리 오류가 있는 것은?

 

답: a)

(x = 10) 이거는 변수에 값을 할당하는 거임

 

 

 

6.다음 코드의 출력 결과는 무엇인가?

 

답: Wednesday

 

 

 

7.switch 문에서 break 문을 생략하면 어떤 결과가 발생하는가?

 

답: 다음 case의 코드도 연속적으로 실행된다.

 

 

 

8.다음 중 switch 문의 올바른 사용 예는?

 

답: c)

 

 

 

9.다음 코드의 출력 결과는 무엇인가?

 

답: Good Fair

 

 

 

10.다음 중 switch 문에서 사용할 수 없는 자료형은?

 

답: double

부동소수점 값은 정확하지 않기 때문에

 

 

 

11.다음 코드의 출력 결과는 무엇인가?

 

답: 0 1 2

 

 

 

12.다음 중 무한 루프를 생성하는 for 문의 예는?

 

답:  d)

 

 

 

13.다음 코드의 출력 결과는 무엇인가?

 

답: 5 4

 

 

 

14.다음 중 for 문을 사용하여 1부터 10까지의 합을 구하는 올바른 코드는?

 

답: a), c)

 

 

 

15.다음 코드의 츨력 결과는 무엇인가?

 

답: 0 1 3 4

 

 

 

16.다음 코드의 출력 결과는 무엇인가?

 

답: 1 2 3

 

 

 

17.다음 중 무한 루프를 생성하는 while 문의 예는?

 

답: a)

 

 

 

18.다음 코드의 출력 결과는 무엇인가?

 

답: 0 1 2 4

 

 

 

19.다음 중 while 문을 사용하여 1부터 10까지의 홀수를 출력하는 올바른 코드는?

 

답: a)와 c) 모두 올바르다.

 

 

 

20.다음 코드의 출력 결과는 무엇인가?

 

답: 0 2

 

 

 

21.다음 코드의 출력 결과는 무엇인가?

 

답: 1 2 3 4 5

 

 

 

22.다음 중 for-each 문을 사용하는 이유로 옳지 않은 것은?

 

답: 요소를 수정할 수 있기 위해

 

 

 

23.다음 코드의 출력 결과는 무엇인가?

 

답: A B C

 

 

 

 

 24. 다음 중 for-each 문을 사용하여 리스트의 모든 요소를 출력하는 올바른 코드는? 

 

답: b와 c 모두 올바르다.

 

 

 

25.다음 코드의 출력 결과는 무엇인가?

 

답: 20

 

 

 

반응형