티스토리 뷰
1. 배열타입 (sample71부터)
- 배열 타입 별 항목의 기본값은 다음과 같다.
- 1) 기본타입(정수) : 0
- 2) 기본타입(실수) : 0.0
- 3) 기본타입(논리) : false
- 4) 참조타입 : null
- 배열의 길이(.length)는 읽기 전용이기에 배열 길이의 조절은 불가능하다.
- 다차원 배열 : 2차원 배열 이상의 배열을 의미한다.
- 1차원 배열 : 배열의 원소가 하나의 값 (스칼라) ex. Int [] arr1 = { 1,2,3 };
- 2차원 배열 : ex. Int [] [] arr2 = { { 1, 2 } , { 3, 4} }; 이 경우 원소의 크기는 2이다.
- Ex. Int [ ] [ ] arr2 = { { 1, 2 } , { 3, 4 } , { 5, 6 } };
- EX. int [ ] [ ] arr2 = { { 1 , 2 } , { 3 , 4 } , { 5 , 6, 7 } };도 가능하다.
- Int [] [] arr2 = {
{ 1, 2 }
{ 3, 4 }
- } ; // 2차원 배열( 2 x 2 = 세로 x 가로) - arr2
- 2차원에서 원소를 끄집어 낼 때는 차근차근 밖에 있는 배열의 원소 중에 인덱스 몇 번째를 꺼내고 싶은지 [ ]를 통해 작성하고 그 후에 또 그 안의 몇 번째를 꺼낼지 [ ] 를 통해 지정한다. 차원과 상관없이 인덱스는 0번부터 시작한다.
- Ex. arr2 [ 0 ] [ 0 ] => 1을 꺼낼 수 있다.
- EX. arr2 [ 1 ] [ 1 ] => 4를 꺼낼 수 있다.
- Ex. arr2 [ 0 ] [ 0 ] = 100;을 통해 1을 100으로 바꿀 수도 있다.
- 3차원 배열 : ex. Int [] [] [] arr3 = { { { 1, 2 } , { { 3 , 4 } } };
- 두번째 배열에서는 원소가 { 1 , 2 } 밖에 없으므로 원소가 1개만 있는 것이다.
- Ex. arr3 [ 0 ] [ 0 ] [ 0 ] => 1을 꺼낼 수 있다.
- EX. arr3 [ 1 ] [ 0 ] [ 1 ] =>4를 꺼낼 수 있다.
- 인덱스 번호가 0번부터 시작한다는 것을 까먹어서는 안된다.
- 대부분의 배열은 2차원 배열에서 끝나게 된다. 3차원 이상이면 검토해보기!
- 배열은 한 번 생성하면 크기 변경이 불가능하다.
- 더 많은 저장 공간이 필요하자면 보다 큰 배열을 새로 만들고, 이전 배열로부터 항목 값들을 복사해야 한다.
- 배열 복사 방법 : for문 이용, System.arraycopy() 메소드 이용, Arrays 클래스 이용
- System.arraycopy(originArr, offset, targetArr, offset, length);
- System.arraycopy(originArr(복사할 대상), offset(어디에서 부터),
- targetArr(복사해서 넣을 대상), offset(어디서부터), length(몇개));
- newstrArray = Arrays.copyOf(oldStrArray, oldStrArray.length);
2. 참조타입 배열 – 각 항목에 객체의 번지를 가진다.
- EX. String [ ] strArray = new String[3];
- EX. strArray [ 0 ] = “JAVA”;
3. 열거 타입
- 한정된 값만 갖는 데이터 타입이다.
4. 자바 언어에서 이름(식별자)을 짓는 규칙
- 영문자, 소문자, 숫자는 사용이 가능하다.
- 특수문자는 “_” 와 “$”만 사용이 가능하다.
- 첫번째 문자가 숫자로 시작할 수 없다.
- 기본적으로 camel기법을 적용한다.
- 변수명은 소문자(특수기호)로 시작한다.
- class명은 대문자로 시작한다.
- 메소드명은 소문자로 시작한다.
5. 열거상수
- 상수 이름을 짓는 규칙 : 대문자
- 참조타입 중 하나이다!!
- 열거상수 하나하나가 객체이다! 타입은 Public enum 타입명 { } 이다.
- 열거 상수 사이에는 순서가 존재한다.
- 열거타입의 목적은 열거타입 변수에 대입 가능한 값을 “제한”시키는 것이다.
6. 요약
- 1. 클래스는 붕어빵 틀 , 객체는 붕어빵임을 잊지 마라!
- 2. 붕어빵(객체)을 만들어 내기 위해서는, 붕어빵 틀(클래스)이 필요하다.
7. 객체 지향 프로그래밍 ( OOP )
- 부품 객체를 먼저 만들고 이것들을 하나씩 조립해 완성된 프로그램을 만드는 기법
- 객체는 필드(속성)과 메소드(동작/행위)로 구성된 자바 객체로 모델링 가능
- 현실 세계에 있는 객체를 클래스로 만드는 것을 객체 모델링이라고 한다.
- “객체(속성+행위) è 클래스” 로 만드는 과정을 객체 모델링이라고 한다.
- Lombok을 잘 활용하면 코딩양을 대폭 줄여줄 수 잇다.
01. 배열의 초기값 - enhanced for문
public class Sample71 {
public static void main(String[] args) {
// 배열 타입의 초기값
int [] arr1 = new int[3];
for (int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] : " + arr1[i]);
} // for
for ( int number : arr1 ) {
System.out.println(number);
} // enhanced for문 - 일부터 arr1[i]라고 sysout에 치지 않아도 하나씩 빠져와서 출력됨을 알 수 있디.
// Iterable(반복이 가능한) 객체만 enhanced for에 올 수 있다.
// =================================== 정수타입 기본값만 출력하게 되면, arr1[0] : 0 식으로 arr1[2] : 0까지 출력되게 된다.
// =================================== 정수타입의 배열 초기값은 0임으로 볼 수 있다.
arr1 [0] = 10;
arr1 [1] = 20;
arr1 [2] = 30;
for(int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] : " + arr1[i]);
} // classical for
for (int number : arr1) {
System.out.println("arr1" + " : " + number);
} //enhanced for
// =================================== 베열의 원소의 값을 바꿔보는 코드이다.
double[] arr2 = new double[3];
for(int i=0; i<3; i++) {
System.out.println("arr2[" + i + "] : " + arr2[i]);
} // for
for( double number1 : arr2) {
System.out.println(number1);
} // enhanced for
// =================================== 실수타입 배열의 초기값을 출력하게 되면 arr2[0] : 0.0 식으로 출력된다.
// =================================== 실수타입의 초기값은 0.0임을 알 수 있다.
arr2[0] = 0.1;
arr2[1] = .2; // == 0.2
arr2[2] = 0.3;
for(int i = 0; i<arr2.length; i++) { // i<3보다는 i< arr2.length으로 범위 형성하는 것이 더 명확하다.
System.out.println("arr2[" + i + "] : " + arr2[i]);
} // for
// =================================== 실수타입 배열의 원소가 초기값에서 바뀌었음을 알 수 있다.
String[] arr3 = new String[3];
for(int i=0; i<arr3.length;i++) {
System.out.println("arr3[" + i + "] : " + arr3[i]);
} // for
// =================================== 참조타입 배열의 초기값을 출력해보자 arr3[0] : null 식으로 출력됨을 알 수 있다.
// =================================== 참조타입의 초기값은 null임을 알 수 있다.
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
for(int i = 0; i<3; i++) {
System.out.println("arr3[" + i + "] : " + arr3[i]);
} // for
// =================================== 참조타입 배열의 원소가 초기값에서 바뀌었음을 알 수 있다.
} // main
} // end class
02. 다차원 배열
public class Sample72 {
public static void main (String[] args) { // 다차원 배열 (*********)
int [] [] mathScores = new int[2][3];
for (int i=0; i<mathScores.length; i++) { // 첫번째 배열의 길이는 2이므로 2번 반복되게 된다.
for(int k=0; k<mathScores[i].length; k++) { // matScores.length가 가능한 이유는 원소가 배열이기 때문이다.
// 안의 배열의 경우 길이가 3인 배열이기 때문에 3번 반복되게 된다.
System.out.println("mathScores [" + i + "] [" + k + "] = " + mathScores[i][k]);
} //inner for
} // outer for
int[][] mathScores22 = { { 1, 2 } , { 3, 4 } , { 5, 6, 7 } };
for ( int[] arr1 : mathScores22 ) { // enhanced for문 활용 (*****)
for ( int number : arr1 ) {
System.out.println(number);
} // inner enhanced for
} // outer enhanced for
// 순회할때는 enhanced for문을 사용하는 것이 편하지만, 특정 1개를 특정지을 때에는 for문을 사용해야 한다.
System.out.println("mathScores22 배열의 길이 : " + mathScores22.length); // 길이 : 3
System.out.println("mathScores22 배열의 첫번째 원소의 길이 : " + mathScores22[0].length); // 길이 : 2
System.out.println("mathScores22 배열의 두번째 원소의 길이 : " + mathScores22[1].length); // 길이 : 2
System.out.println("mathScores22 배열의 세번째 원소의 길이 : " + mathScores22[2].length); // 길이 : 3
System.out.println();
// =======================================
} // main
} // end class
03. 배열을 복사하는 방법
import java.util.Arrays;
public class Sample73 {
public static void main(String[] args) { // 배열의 복사 - 수작업
int[] oldIntArray = { 1, 2, 3 };
int[] newIntArray = new int [5];
for(int i=0; i<oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
} // classical for
for (int i=0; i< newIntArray.length;i++) {
System.out.print(newIntArray[i] + ", "); // 1, 2, 3, 0, 0, 로 출력이 된다. 값이 없으면 0으로 출력이 된다.
} // classical for
System.out.println(Arrays.toString(newIntArray)); // [1, 2, 3, 0, 0]으로 배열이 단정하게 출력된다.
// 자동완성은 컨트롤 + 스페이스바
// 배열을 단정하게 출력하기 위해서는 Arrays.toString(변수이름)을 외우는 것이 좋다. (****)
} // main
} // end class
04. 배열을 복사하는 방법 2
import java.util.Arrays;
public class Sample74 {
public static void main(String[] args) {
String[] oldStrArray = { "Java", "array", "copy" };
String[] newstrArray = new String[5];
//배열의 복사 : System.arraycopy(originArr, offset, targetArr, offset, length) (*******)
// System.arraycopy(originArr(복사할 대상), offset(어디에서 부터), targetArr(복사해서 넣을 대상), offset(어디서부터), length(몇개))
System.arraycopy(oldStrArray, 0, newstrArray, 0, oldStrArray.length); // (***********)
System.out.println(Arrays.toString(newstrArray)); // (********)
//===========================================================================
newstrArray = Arrays.copyOf(oldStrArray, oldStrArray.length);
System.out.println(Arrays.toString(newstrArray)); // [Java, array, copy]로 출력이 된다.
// 이 유형의 경우, 배열의 작은 편으로 복사되게 된다.
} // main
} // end class
05. 열거상수
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
} // end enum
// 각 값들을 ","로 구분하게 된다.
// 각 값들은 열거상수라고 부르는데, 이 값들은 값 변환이 불가능하다.
// 열거타입의 상수는 순서가 존재하고 순서에 따라서 끄집어낼 수는 있지만, 딱히 자주 사용하지는 않는다.
// Week.class라는 파일이 생성되어 있다.
public class Sample76 {
public static void main(String[] args) {
// name() 메소드
Week today = Week.SUNDAY; // 열거상수로 초기화하여, 열거타입변수 "정의"
// 도트연산자( . ) : "객체의 멤버를 참조(=사용)하는 연산자" --> "객체멤버참조 연산자"
// 객체 : 1. 고유한 성질 -> "필드(fields)" 2. 기능(=행위) -> "메소드(method)"
// 기능은 .name가 열거상수의 이름을 가르쳐 추는 것처럼 일정한 기능을 수행한다.
String name = today.name();
System.out.println(name); // sunday라고 출력
// =======================================================================
// ordinal() 메소드
int ordinal = today.ordinal(); // today에 해당되는 SUNDAY라는 열거상수값이 몇번째에 있는지 확인해 준다.
System.out.println(ordinal); // 6이라고 출력
// 순서는 인덱스번호처럼 0번부터 시작되기에 7번째라고 하더라고 6이라고 출력이된다.
// =======================================================================
// compareTo() 메소드
Week day1 = Week.MONDAY;
Week day2 = Week.WEDNESDAY;
int result1 = day1.compareTo(day2);
int result2 = day2.compareTo(day1);
System.out.println(result1); // -2가 출력된다. <-- 월요일이 0번째 - 수요일이 2번째이기에 = -2가 출력된다.
System.out.println(result2); // +2가 출력된다.
// 자바언어에서는 두 변수의 값을 비교할 때, 아래와 같은 원칙으로 값을 생성하게 되어있다.
// 1. 기준변수 == 비교변수 --> return 0 (정수타입으로 0이 나오면 같다는 의미이다.)
// 2. 기준변수 < 비교변수 --> return 음수값 (-1)
// 3. 기준변수 > 비교변수 --> return 양수값 (+1)
// =======================================================================
// values() 메소드
Week[] days = Week.values(); // Week의 모든 열거상수를 반환하라!
for( Week day : days ) {
System.out.println(day); // MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY가 출력된다.
// 각각 상수의 이름이 출력되게 된다.
} // for
} // main
} // end class
06. 열거상수의 응용
import java.util.Calendar;
public class Sample77 {
public static void main(String[] args) {
Week today = null;
//
Calendar cal = Calendar.getInstance();
int week = cal.get(Calendar.DAY_OF_WEEK);
//
switch(week) { // 일요일은 1에서 시작해서 토요일 7로 끝난다.
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;
} // switch
System.out.println("오늘 요일 : " + today);
// 아래처럼 요일마다 다른 로직을 실행해야 될때 열거상수를 사용한다.
if(today == Week.SUNDAY) {
System.out.println("일요일에는 축구를 합시다!");
} else {
System.out.println("열심히 자바 공부를 합시다!");
}// if - else
} // main
} // end class
07. 열거상수의 응용2
public class Sample78 {
public static void main(String[] args) {
// 이전 switch문과 새로운 switch 문 비교
Week today = Week.FRIDAY;
// today = 100; <---- 열거타입변수이기에 다른 숫자를 넣는 것이 불가능하여, 컴파일 오류가 뜬다.
// Week도 타입 중 하나이다.
// A. 이전 switch문 예
String typeOfDay = null; // 참조타입의 변수로 null을 사용할 수 있다.
switch(today) {
case MONDAY :
case TUESDAY :
case WEDNESDAY :
case THURSDAY :
case FRIDAY : typeOfDay = "Working Day"; break; // 월요일부터 금요일이 될때까지 break;문이 없으므로
// 월요일부터 금요일은 Working Day가 출력되고 나서야 break;가 된다. ( 응용*** )
case SATURDAY :
case SUNDAY : typeOfDay = "Day Off"; break;
} // switch - 열거상수 또한 case : 로 사용이 가능하다. ( 실수타입은 불가능하다.)
System.out.println("1.typeOfDay : " + typeOfDay );
// ======================================================================
// B. New switch expression
typeOfDay = switch(today) {
case MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY -> "Working Day";
case SATURDAY,SUNDAY -> "Day Off";
}; // switch expression
System.out.println("2. typeOfDay : { " + typeOfDay + " }");
// ======================================================================
switch(today) {
case MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY -> System.out.println("3. Working Day");
case SATURDAY,SUNDAY -> System.out.println("3. Day Off");
} // switch expression - 2
// ======================================================================
// 더 복잡한 논리는 중괄호 { }로 감싸야 합니다.
typeOfDay = switch(today){
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> {
System.out.println("1st. case");
System.out.println("\t + Working Day");
yield "Working day"; // --> 이를 typeOfDay로 반환해 준다.
}
case SATURDAY, SUNDAY -> {
System.out.println("2nd. case");
System.out.println("\t + Day Off");
yield "Day Off"; // --> 이를 typeOfDay로 반환해 준다.
}
}; //switch - 값을 생성해서 대입하는 실행문장일때는 끝에 ;를 붙어여 한다.
// ======================================================================
} // main
} // end class
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 10일차 - 생성자 및 인스턴스 / 정적 멤버 (0) | 2022.03.10 |
---|---|
KH 09일차 - 클래스와 필드 (0) | 2022.03.09 |
KH 07일차 - 참조타입 (0) | 2022.03.04 |
KH 06일차 - 조건문과 반복문 (0) | 2022.03.03 |
KH 05일차 - 연산자 및 조건문과 반복문 (0) | 2022.03.02 |