- 자료형
- 맵, 집합, 상수 집합, 형 변환, final
- 제어문
- if 문, switch/case 문, while 문, for 문, for each 문
- 메서드 정리
- 퀴즈, 코테
자료형
맵
- 대응 관계 표현
- 키(key)와 값(value)을 한 쌍으로 갖는 자료형
- 순서가 없다.
- HashMap, LinkedHashMap(입력 순으로 데이터 저장), TreeMap(입력된 key의 오름차순으로 데이터 저장) 등이 있고 HashMap이 가장 기본이다
- HashMap의 메서드
- put (key와 value 추가)
- get (key에 해당하는 value얻을 때)
- containsKey (해당 key가 있는지 t/f로 리턴)
- remove (해당 key의 항목 삭제 후 value 값 리턴)
- size (맵 요소의 개수 리턴)
- keySet (맵의 모든 key를 모아 리턴)
import java.util.HashMap;
public class Sample {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구"); // key와 value 추가
System.out.println(map.get("people")); // "사람" 출력
System.out.println(map.containsKey("people")); // true 출력
System.out.println(map.remove("people")); //key와 value가 모두 삭제된 후 "사람" 출력
System.out.println(map.size()); // 1 출력
System.out.println(map.keySet()); // [baseball] 출력 (모든 key모아서 집합자료형으로 리턴)
}
}
집합
- 집합(Set) 자료형은 집합과 관련된 것을 쉽게 처리하기 위해 만든 것으로 HashSet, TreeSet, LinkedHashSet 등이 있다.
- 가장 많이 사용하는 HashSet
- 중복 허용 x
- 순서 x (맵과 마찬가지)
- HashSet의 메서드
- retainAll (교집합)
- addAll (합집합)
- removeAll (차집합)
- add (원소 추가)
- addAll (값을 한꺼번에 여러 개 추가)
- remove (특정 값 제거)
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
HashSet<Integer> intersection = new HashSet<>(s1); // s1으로 intersection 생성
intersection.retainAll(s2); // 교집합 수행
System.out.println(intersection); // [4, 5, 6] 출력
HashSet<Integer> union = new HashSet<>(s1); // s1으로 union 생성
union.addAll(s2); // 합집합 수행
System.out.println(union); // [1, 2, 3, 4, 5, 6, 7, 8, 9] 출력
HashSet<Integer> substract = new HashSet<>(s1); // s1으로 substract 생성
substract.removeAll(s2); // 차집합 수행
System.out.println(substract); // [1, 2, 3] 출력
}
}
교,차,합집합을 구할때는 먼저 그것에 맞는 변수(공간)를 생성해야함!!
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("Jump");
set.add("To");
set.add("Java");
System.out.println(set); // [Java, To, Jump] 출력
set.addAll(Arrays.asList("Jump","To", "Java")); // 이렇게 다같이 할 수도 있음
set.remove("To");
System.out.println(set); // [Java, Jump] 출력
}
}
상수 집합 (enum 자료형)
- 서로 연관 있는 여러 개의 상수 집합을 정의할 때 사용
public class Sample {
enum CoffeeType {
AMERICANO,
ICE_AMERICANO,
CAFE_LATTE
};
public static void main(String[] args) {
System.out.println(CoffeeType.AMERICANO); // AMERICANO 출력
for(CoffeeType type: CoffeeType.values()) {
System.out.println(type); // 순서대로 AMERICANO, ICE_AMERICANO, CAFE_LATTE 출력
}
}
}
- 종류별로 판매된 커피의 개수를 리턴할 때 ➡️ 메서드가 존재하진않지만 아래와 같은 식으로 활용
/**
* countSellCoffee는 판매된 커피의 갯수를 리턴하는 메서드이다.
* @param type 커피의 종류 (1: 아메리카노, 2: 아이스 아메리카노, 3: 카페라떼)
*/
int countSellCoffee(int type) {
... 생략 ...
}
int americano = countSellCoffee(1); // 이런식으로 사용한다. 숫자를 기억헤야하는 단점이 있음
이런식으로 숫자를 기억해야하는 단점이 있어 이를 숫자 대신 상수 집합인 CoffeType을 인수로 사용하면 보다 코드가 명확해지고 잘못된 값을 사용해 생길 수 있는 오류를 막을 수 있다.
enum CoffeeType {
AMERICANO,
ICE_AMERICANO,
CAFE_LATTE
};
/**
* countSellCoffee는 판매된 커피의 갯수를 리턴하는 메서드이다.
* @param type 커피의 종류 (CoffeType)
*/
int countSellCoffee(CoffeType type) {
... 생략 ...
}
int americano = countSellCoffee(CoffeType.AMERICANO); // 아메리카노의 판매갯수
형 변환
1. 문자열 -> 정수형
String num = "123";
int n = Integer.parseInt(num);
2. 정수형 -> 문자열
// 1. 가장 쉬운 방법
int n = 123;
String num = "" + n;
// 2.
String num1 = String.valueOf(n);
String num2 = Integer.toString(n);
System.out.println(num1); // 123 출력
System.out.println(num2); // 123 출력
3. 소수점 포함 문자열 -> 실수형
Double.parseDouble이나 Float.parseFloat를 사용
String num = "123.456";
double d = Double.parseDouble(num);
4. 정수형 <-> 실수형
int n1 = 123;
double d1 = n1; // 정수를 실수로 바꿀때에는 캐스팅이 필요없다.
System.out.println(d1); // 123.0 출력
double d2 = 123.456;
int n2 = (int) d2; // 실수를 정수로 바꿀때에는 반드시 정수형으로 캐스팅해 주어야 한다.
4. 실수형태 문자열 -> 정수형
Double.parseDouble을 이용해 실수로 바꾼 후 사용
String num = "123.456";
int n = Integer.parseInt(num); // 실수 형태의 문자열을 정수로 변환할 경우 NumberFormatException이 발생한다.
final ( 재할당 불가능 )
- 자료형에 값을 단 한 번만 설정할 수 있게 강제하는 키워드
- 값을 다시 바꿀 수 없음 (리스트의 경우도)
- 프로그램을 수행하면서 그 값이 바뀌면 안 될 때 사용
- 다시 바꾸려하거나 리스트의 경우에도 다시 할당했을 때 모두 컴파일 에러 발생!
- 만약 값을 더하거나 빼는 것도 할 수 없게 하고 싶다면 List.of를 작성하여 수정할 수 없는 리스트(unmodifiable list)로 만들면 된다.
import java.util.List;
public class Sample {
public static void main(String[] args) {
final List<String> a = List.of("a", "b");
a.add("c"); // UnsupportedOperationException 발생
}
}
제어문
if 문 ( + else if 문)
if (조건문) {
<수행할 문장1>;
<수행할 문장2>;
...
} else {
<수행할 문장A>;
<수행할 문장B>;
...
}
- List 자료형의 contains (해당 아이템 여부 조사) ➡️ 조건문에 많이 활용됨
ArrayList<String> pocket = new ArryList<String>();
pocket.add("paper");
pocket.add("handphone");
pocket.add("money");
if (pocket.contains("money")) {
System.out.println("택시를 타고 가라");
}else {
System.out.println("걸어가라");
}
// 택시를 타고 가라
- and, or ,not 연산자
연산자 | 설명 |
x && y | and ( x와 y 모두 참이어야 참) |
x || y | or ( x와 y 모두 참이어야 참) |
! x | not x ( x가 거짓이면 참) |
- else if 문
- 처음 조건에서 거짓이 되고 또 그 거짓에서 참 거짓이 나뉠 때 else if 를 이용
- else if는 이전 조건문이 거짓일 때 수행됨
- 마지막 조건의 거짓이 else임
if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
}else if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
}else if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
...
} else {
<수행할 문장1>
<수행할 문장2>
...
}
switch / case 문
- 입력값이 정형화되어 있는 경우 if 문보다는 switch/case 문을 쓰는 것이 코드의 가독성이 좋다.
- switch/case 문은 if 문으로 변경이 가능하지만 if 문으로 작성된 모든 코드를 switch 문으로 변경할 수는 없다.
switch(입력변수) {
case 입력값1: ...
break;
case 입력값2: ...
break;
...
default: ...
break;
}
while 문
- 조건문이 참이면 문장을 반복실행한다.
while (조건문) {
<수행할 문장1>;
<수행할 문장2>;
<수행할 문장3>;
...
}
- break, continue
- 무한 루프 (무한반복)
- 프로그램에서 자주 사용됨!
- 조건문 자체가 true이므로 조건문은 항상 참이 된다 -> 수행할 문장이 계속 수행됨
- Ctrl + C 를 눌러서 빠져나간다.
while (true) {
<수행할 문장1>;
<수행할 문장2>;
...
}
예제 ) 사용자가 입력한 점수들의 평균을 내는 프로그램
음수를 입력하면 break에 의하여 반복 루프가 종료되게 한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int total=0,count=0, avg=0;
Scanner scanner = new Scanner(System.in);
while (true){
System.out.print("점수를 입력하시오: ");
int grade = scanner.nextInt();
if (grade<0) break;
total+=grade;
count++;
avg=total/count;
}
System.out.println("평균은 "+avg);
}
}
//결과
점수를 입력하시오: 10
점수를 입력하시오: 20
점수를 입력하시오: -1
평균은 15
- do - while 문
- 조건이 참이면 반복을 계속한다.
do {
문장1;
문장2;
...
} while (조건)
예제 ) 사용자로부터 올바른 월 번호를 입력할 때까지 반복을 계속하는 프로그램
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int month;
do {
System.out.print("올바른 월을 입력하시오 [1-12]: ");
month =scanner.nextInt();
} while (month<1 || month>12);
System.out.println("사용자가 입력한 월은 " +month);
}
}
// 결과
올바른 월을 입력하시오 [1-12]: 31
올바른 월을 입력하시오 [1-12]: 21
올바른 월을 입력하시오 [1-12]: 1
사용자가 입력한 월은 1
for 문
for (초기치; 조건문; 증가치) {
...
}
- continue ( for 문으로 돌아가기 )
예제 ) 합격 여부를 알려주는 프로그램
60점 이상인 사람에게는 축하 메시지를 보내고 나머지 사람에게는 아무런 메시지도 전하지 않는 프로그램
int[] marks = {90, 25, 67, 45, 80};
for(int i=0; i<marks.length; i++) {
if (marks[i] < 60) {
continue; // 조건문으로 돌아간다.
}
System.out.println((i+1)+"번 학생 축하합니다. 합격입니다.");
}
// 결과
1번 학생 축하합니다. 합격입니다.
3번 학생 축하합니다. 합격입니다.
5번 학생 축하합니다. 합격입니다.
- 이중 for 문 (중첩반복문)
예제1 ) 구구단
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
for (int x=2; x<10;x++){
for (int y=1;y<10;y++){
System.out.print(x*y + " ");
}
System.out.println();
}
}
}
// 결과
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
- for (초기치)에서 초기치는 초기 변수를 설정하는거임!!
- 웬만한 계산은 System.out.print();에서 설정하기!
- 상위 for문 에서의 System.out.println(); 은 줄을 바꾸어 출력하는 역할을 한다.
- 상위 for문 : 행
- 하위 for문 : 열
예제2 ) 5*10 사각형 별 출력하는 프로그램
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
for (int x=1; x<6;x++){
for (int y=1;y<11;y++){
System.out.print("*");
}
System.out.println();
}
}
}
// 결과
**********
**********
**********
**********
**********
for each 문
- for문은 for each 문으로 변경할 수 있다.
- 반복 횟수를 명시적으로 주는 것이 불가능
- 한 단계씩 순차적으로 반복할 때만 사용 가능
// for문 사용
String[] numbers = {"one", "two", "three"};
for(int i=0; i<numbers.length; i++) {
System.out.println(numbers[i]);
}
// for each문 사용
String[] numbers = {"one", "two", "three"};
for(String number: numbers) {
System.out.println(number);
}
//결과
one
two
three
구조
for (type 변수명: iterate) {
body-of-loop
}
// 변수명 새로 설정해야함!
기본형 참조형 차이
메모리 | 값 자체를 저장 | 객체의 메모리 주소를 저장 |
null 가능 | 불가능 | 가능 (null로 참조 해제 가능) |
비교 | 값 자체를 비교 | 메모리 주소를 비교 (값 비교는 .equals()) |
성능 | 메모리 사용 적음, 빠름 | 더 많은 메모리 사용, 상대적으로 느림 |
메서드 정리
String | length | contains | equals | substring | charAt | replaceAll | indexOf | split |
StringBuffer | insert | toString | append | substring | ||||
배열 | length | |||||||
리스트 | size | contains | add | get | remove | |||
맵 (HashMap) | size | containsKey | put | get | remove | containsKey | keySet | |
집합(HashSet) | retainAll | add, addAll | remove, removeAll |
퀴즈 (3.5 ~4장)
문제 | 답 | |
1 |
|
c |
2 |
|
a |
3 |
|
b |
4 |
|
d |
5 |
|
c |
6 |
|
a |
7 |
|
a |
8 |
|
c |
9 |
|
a |
10 |
|
a |
11 |
|
a |
12 |
|
c |
13 | Java의 Set 인터페이스를 사용하는 목적에 대해 서술하시오. | set은 중복되는 요소를 허용하지 않고 순서가 없어 데이터의 순서에 상관없이 처리할 수 있다. |
14 | 형 변환(타입 캐스팅)의 개념을 설명하고, 자바에서의 자동 형 변환과 수동 형 변환의 차이점을 서술하시오. | 형 변환은 변수의 데이터 타입을 다른 데이터 타입으로 변환하는 과정이며 차이점은 작은 데이터에서 큰 데이터로 변환할때는 자동으로 이루어지지만 역은 명시적으로 형 변환 연산자를 사용해야함 |
15 | Java의 final 키워드에 대해 설명하고, final 변수를 사용할 때의 장점을 서술하시오. | 재할당이 불가능하며 코드의 안정성을 높이고 의도치않은 변경을 방지한다. |
16 | 형 변환 시 발생할 수 있는 예외 상황에 대해 설명하고, ClassCastException이 발생하는 경우를 예로 들어 설명하시오. | 잘못된 형 변환을 시도할 경우 ClassCastException이 발생할 수 있다. |
4-1 | 다음 코드의 출력 결과는 무엇인가? | a |
2 | 다음 중 if 문의 올바른 사용법은? | b |
3 | 다음 중 중첩 if 문의 예는? | a |
4 | 다음 if-else if-else 구조에서 result의 값은 무엇인가? | b |
5 | 다음 if 문에서 논리 오류가 있는 것은? | a |
6 | 다음 코드의 출력 결과는 무엇인가? | c |
7 | switch 문에서 break 문을 생략하면 어떤 결과가 발생하는가? a) 컴파일 오류가 발생한다. b) 해당 case의 코드만 실행된다. c) 다음 case의 코드도 연속적으로 실행된다. d) default 블록이 무조건 실행된다. |
c |
8 | 다음 중 switch 문의 올바른 사용 예는? | c a) switch 문 은 boolean값을 사용할 수 없음 b)day라는 변수 정의 되어있지 않음 d) switch문은 float또는 double같은 실수형 값을 사용할 수 없 |
9 | 다음 코드의 출력 결과는 무엇인가? | a |
10 | 다음 중 switch 문에서 사용할 수 없는 자료형은? a) int b) String c) double d) char |
c |
11 | 다음 코드의 출력 결과는 무엇인가? | a |
12 | 다음 중 무한 루프를 생성하는 for 문의 예는? | b,d |
13 | 다음 코드의 출력 결과는 무엇인가? | a break는 아예 그 조건문이 끝나는 거임!!! |
14 | 다음 중 for 문을 사용하여 1부터 10까지의 합을 구하는 올바른 코드는? | a,c |
15 | 다음 코드의 출력 결과는 무엇인가? | b |
16 | 다음 코드의 출력 결과는 무엇인가? | a |
17 | 다음 중 무한 루프를 생성하는 while 문의 예는? | a |
18 | 다음 코드의 출력 결과는 무엇인가? | b |
19 | 다음 중 while 문을 사용하여 1부터 10까지의 홀수를 출력하는 올바른 코드는? | d |
20 | 다음 코드의 출력 결과는 무엇인가? | b |
21 | 다음 코드의 출력 결과는 무엇인가? | a |
22 | 다음 중 for-each 문을 사용하는 이유로 옳지 않은 것은? a) 배열이나 컬렉션의 모든 요소를 간편하게 순회하기 위해 b) 인덱스 관리를 자동으로 해주기 위해 c) 요소를 수정할 수 있기 위해 d) 코드의 가독성을 높이기 위해 |
c |
23 | 다음 코드의 출력 결과는 무엇인가? | a |
24 | 다음 중 for-each 문을 사용하여 리스트의 모든 요소를 출력하는 올바른 코드는? | d 리스트 요소가 String이지만, Object 타입으로도 받을 수 있다. |
25 | 다음 코드의 출력 결과는 무엇인가? | b |
** continue는 반복문(예: for, while)에서 해당 반복의 나머지 부분을 건너뛰고, 바로 다음 반복을 실행하도록 하는 제어문이다 **
코테
3.5장
1. https://school.programmers.co.kr/learn/courses/30/lessons/42576
2.https://school.programmers.co.kr/learn/courses/30/lessons/12943
4장
1.https://school.programmers.co.kr/learn/courses/30/lessons/120844
2.https://school.programmers.co.kr/learn/courses/30/lessons/12943
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 이민형 #2주차 (3~4장) (1) | 2024.10.16 |
---|---|
[2024-2 Java 스터디] 김민서 #2주차 (0) | 2024.10.16 |
[2024-2 Java 스터디] 김지나 #2주차 "~제어문" (0) | 2024.10.16 |
[2024-2 Java 스터디] 김태일 #2주차 (4) | 2024.10.15 |
[2024-2 Java 스터디] 정채은 #1주차 (0) | 2024.10.10 |