[이것이 자바다] 5장 정리
자바 참조 타입에 대한 정리입니다. 얕은 복사와 깊은 복사, 다차원 배열, charAt() 메서드, forEach문, replace() 메서드, substring() 메서드, Enum 등에 대해 다루고 있습니다.
Jan 08, 2024
ArrayExam.java
package ch05;
public class ArrayExam {
public static void main(String[] args) {
int[] heights = new int[5]; // 배열을 선언할 때는 사이즈를 꼭 명시해줘야 한다.
heights[0] = 170;
heights[1] = 174;
heights[2] = 176;
heights[3] = 179;
heights[4] = 185;
// 얕은 복사 - 동일한 배열을 참조
// int[] heights2 = heights;
// heights2[0] = 190; // 배열의 경우 string과 다르게 참조하는 위치의 값을 변경할 수 있다.
// 깊은복사
// int[] heights2 = new int[heights.length];
// for(int i=0; i<heights.length; i++) {
// heights2[i] = heights[i];
// }
// 깊은복사 2
int[] heights2 = new int[heights.length];; // 빈 배열 생성
System.arraycopy(heights, 0, heights2, 0, 5); // System.arrcopy 메서드 사용해서 복사
for (int i = 0; i < heights.length; i++) {
System.out.println(heights[i]);
}
System.out.println();
for (int i = 0; i < heights2.length; i++) {
System.out.println(heights2[i]);
}
}
}
핵심 키워드
- 얕은 복사는 동일한 배열을 참조하므로 참조하는 위치의 값이 변경될 수 있다.
- 이를 유도할 것이 아니라면 배열의 값을 for문이나 arraycopy() 메서드를 통해 깊은 복사를 쓴다.
ArrayPractice.java
package ch05;
import java.util.*;
public class ArrayPractice {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 학급 수 설정
System.out.printf("학급 수를 입력하세요 --> ");
int classNum = scan.nextInt();
// 입력받은 수만큼 행 설정
String[][] classHeights = new String[classNum][];
// String[][] className = new String[classNum][];
// 학급 수 만큼 학생 키 설정
for (int i = 0; i < classNum; i++) {
System.out.printf("%d반 학생 수를 입력하세요 --> ", i + 1);
int studentNum = scan.nextInt();
scan.nextLine();
// 입력받은 수 만큼 열 설정
classHeights[i] = new String[studentNum];
// className[i] = new String[studentNum];
// 열의 크기 만큼 학생의 키 설정 반복
for (int j = 0; j < studentNum; j++) {
System.out.println("---------------입력---------------");
System.out.printf("%d반의 %d번 학생의 이름과 키를 공백으로 구분해서 입력하세요 --> ", i + 1, j + 1);
String studentInfo = scan.nextLine();
// 입력받은 이름과 키를 공백으로 구분
String[] info = studentInfo.split(" ");
// 분리한 이름과 키를 ()를 붙여서 저장
classHeights[i][j] = info[0] + "(" + info[1] + ")";
// 분리한 이름과 키 값을 각각의 배열에 할당
// className[i][j] = info[0];
// classHeights[i][j] = info[1];
}
}
// 각 반 학생의 키 출력
for (int i = 0; i < classHeights.length; i++) {
System.out.printf("%d반 학생들의 키: ", i + 1);
for (int j = 0; j < classHeights[i].length; j++) {
if (j == classHeights[i].length - 1) {
System.out.println(classHeights[i][j]);
// System.out.print(className[i][j]);
// System.out.println("(" + classHeights[i][j] + ")");
} else {
System.out.print(classHeights[i][j] + ", ");
// System.out.print(className[i][j]);
// System.out.print("(" + classHeights[i][j] + "), ");
}
}
}
}
}
핵심 키워드
- 다차원 배열을 이용해서 여러 속성을 가진 데이터를 저장할 수 있다.
- 이런 방식으로 데이터를 저장하면 다른 속성을 추가할 경우에도 계속해서 배열을 만들어야 하므로 비효율적이다.
- 이런 문제를 해결하기 위해 접근할 수 있는 방법으로 여러 속성을 묶어주는 class가 있다.
- nextLine과 split을 사용하지 말고 next()를 쓰면 공백 단위로 입력을 받을 수도 있다. 이 경우 nextInt와 같이 값만 취하는 입력을 받는 경우 scan.nextLine()을 써줘서 버퍼에 남아있는 개행문자를 제거해야 한다.
CharAtExam.java
package ch05;
public class CharAtExam {
public static void main(String[] args) {
String ssn = "9506241230123";
char gender = ssn.charAt(6);
switch (gender) {
case '1':
case '3':
System.out.println("남자입니다.");
break;
case '2':
case '4':
System.out.println("여자입니다.");
}
}
}
핵심 키워드
- charAt() 메서드를 이용해서 문자열의 값을 추출할 수 있다.
ForEach.java
package ch05;
public class ForEach {
public static void main(String[] args) {
String[] strArr= {"자바", "파이썬", "리액트", "AWS"};
// 인덱스를 활용할 필요가 없을 경우 사용 가능
for(String str : strArr) {
System.out.println(str);
}
}
}
핵심 키워드
- for(변수 : 배열) 과 같은 형태의 forEach문을 통해서 배열의 값을 순회할 수 있다.
StringReplace.java
package ch05;
public class StringReplace {
public static void main(String[] args) {
String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "Java");
System.out.println(oldStr);
System.out.println(newStr);
}
}
핵심 키워드
- replace() 메서드를 통해 문자열의 값을 변경할 수 있다.
SubstringExam.java
package ch05;
public class SubstringExam {
public static void main(String[] args) {
String fruit = "사과 딸기 포도 귤";
String[] fruitList = fruit.split(" ");
System.out.println(fruit.length());
for(int i =0; i<fruitList.length; i++) {
System.out.println(fruitList[i]);
}
}
}
핵심 키워드
- 배열의 길이는 .length로 표현하지만 문자열의 길이는 .length()로 표현한다.
Week.java
package ch05;
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
WeekExample.java
package ch05;
import java.util.Calendar;
public class WeekExample {
public static void main(String[] args) {
Week today = null;
Calendar cal = Calendar.getInstance(); // 런타임 중 Calendar 라는 객체는 반드시 하나만 존재해야 하므로 new를 써서 생성하지 않음
int week = cal.get(Calendar.DAY_OF_WEEK);
switch(week) {
case 1: today = Week.SUNDAY; break;
case 2: today = Week.MONDAY; break;
case 3: today = Week.TUESDAY; break;
case 4: today = Week.WEDNESDAY; break;
case 5: today = Week.THURSDAY; break;
case 6: today = Week.FRIDAY; break;
case 7: today = Week.SATURDAY; break;
}
if(today == Week.SUNDAY) {
System.out.println("일요일에는 축구를 합니다.");
}else {
System.out.println("열심히 자바를 공부합니다.");
}
}
}
핵심 키워드
- Enum은 권한과 같이 고정된 값을 명시적으로 표시하기 위해 사용하는 자료형이다.
결론
해당 문제를 풀면서 자바에서의 참조 타입들을 활용하는 방법을 익힐 수 있었다.
Share article