[이것이 자바다] 5장 정리

자바 참조 타입에 대한 정리입니다. 얕은 복사와 깊은 복사, 다차원 배열, charAt() 메서드, forEach문, replace() 메서드, substring() 메서드, Enum 등에 대해 다루고 있습니다.
Jan 08, 2024
[이것이 자바다] 5장 정리

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

👨🏻‍💻DriedPollack's Blog