자바를 "자바라" (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
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 강보경 #2주차 (5) | 2024.10.16 |
---|---|
[2024-2 Java 스터디] 이서영 #2주차 (1) | 2024.10.16 |
[2024-2 Java 스터디] 김민서 #2주차 (0) | 2024.10.16 |
[2024-2 Java 스터디] 이가인 #2주차 (2) | 2024.10.16 |
[2024-2 Java 스터디] 김지나 #2주차 "~제어문" (0) | 2024.10.16 |