Today I Learned

2024 스파르타 내일배움캠프 Sping 트랙 참여 // day7

shinelee26 2024. 10. 10. 22:30

오늘 진행한 학습 요약

1. [Java 문법 종합반] 2주차 : 연산자, 조건문, 반복문, 배열, 컬렉션

  • 조건문 (switch/case , break)
  • 반복문 (for, 향상된 for, while, do-while, continue)
  • 배열 (Array, String 배열, 다차원 배열)
  • 컬렉션 (List, Queue, Set, Map)

2.[Java 문법 종합반] 3주차 : 클래스, 상속, 인터페이스

  • 객체지향 프로그래밍 이해 (객체, 클래스)
  • 클래스 설계
  • 객체 생성과 참조형 변수 (객체생성, 참조형 변수, 객체 배열)
  • 객체의 속성 : 필드 (필드, 필드의 초기값, 필드 초기화)
  • 객체의 행위 : 메서드 (메서드 선언, 메서드 호출, 메서드 오버로딩, 기본형&참조형 매개변수)
  • 인스턴스 멤버와 클래스 멤버  (인스턴스 멤버, 클래스 멤버, 지역변수,  final 필드와 상수)
  • 생성자 (생성자 선언, 생성자 호출, 기본 생성자, 필드 초기화와 생성자 오버로딩)
  • this, this() (this, this())
  • 접근 제어자 (접근 제어자, Getter, Setter, 제어자의 조합)
  • 패키지, import (package, import)
  • 상속 (상속, 클래스 간 관계, 단일상속, 다중상속, final 클래스, final 메서드, object)
  • 오버라이딩 (오버라이딩, super, super())
  • 다형성 (참조변수의 타입 변환, 다형성, instanceof)

학습 정리

1. [Java 문법 종합반] 2주차 : 연산자, 조건문, 반복문, 배열, 컬렉션

  • 조건문 (switch/case)
    • case 연산문 마지막에는 break;를 넣어야한다.
    • 안넣으면 멈추지 않는다!!
더보기
더보기
// case 2 입력
int month = 2;
String monthString = "";
switch (month) {
    case 1:  monthString = "1월";
             break;
    case 2:  monthString = "2월";
             break;
    case 3:  monthString = "3월";
             break;
    default: monthString = "알수 없음";
}
// 2월 출력
System.out.println(monthString);
  • 반복문 (for, 향상된 for, while, do-while, break, continue)
더보기
더보기
// for 문

for(int i=0; i < 4; i++) { // 변수 i 값은 0 ~ 3 까지 반복
    System.out.println(i + "번째 출력"); // i 변수와 문자열 합치기
}

// 출력
0번째 출력
1번째 출력
2번째 출력
3번째 출력

 

// 향상된 for 문

int[] numbers = {3,6,9,12,15};
for(int number: numbers) {
    System.out.print(number + " "); 
}

// 출력
3 6 9 12 15

 

// while 문

int number = 0;
while(number < 3) {
		number++;
    System.out.println(number + "출력"); 
}

// 출력
1출력
2출력
3출력

 

// do-while 문

int number = 4;
do {
    System.out.println(number + "출력"); 
} while(number < 3); // 연산을 한번 수행 후 조건문 체크

// 출력
4출력

 

// break 명령 범위

for (int i = 0; i < 10; i++) {
	System.out.println("i: " + i);
	if (i == 2) {
		break; // i 가 2일때 가장 바깥 반복문이 종료됩니다.
	}
	for (int j = 0; j < 10; j++) {
		System.out.println("j: " + j);
		if (j == 2) {
			break; // j 가 2일때 가장 안쪽 반복문이 종료됩니다.
		}
	}
}

// 출력
i: 0 // 바깥 반복문 부터 수행 시작
j: 0 // 안쪽 반복문 1회차 수행
j: 1
j: 2 // j 가 2일때 안쪽 반복문 break;
i: 1 // 바깥 반복문은 아직 break; 호출이 안됬으므로 다음 반복수행
j: 0 // 안쪽 반복문 2회차 수행
j: 1
j: 2 // j 가 2일때 안쪽 반복문 두번째 break;
i: 2 // i 가 2일때 바깥 반복문도 break; 호출되어 종료

 

// continue 명령

int number = 0;
while(number < 3) {
		number++;
		if (number == 2) {
			continue;  // 2일때 반복 패스
		}
    System.out.println(number + "출력"); 
}

// 출력
1출력
3출력
  • 배열 (Array, String 배열, 다차원 배열)
    • 배열 (Array)
      • 배열 선언 방법
        • 1번 방법
          • int[] intArray; // 정수 배열
            long[] longArray;
            double[] doubleArray; // 실수 배열
            char[] charArray; // 문자 배열
            String[] stringArray; // 문자열 배열
        • 2번 방법
          • int intArray[]; // 정수 배열
            long longArray[];
            double doubleArray[]; // 실수 배열
            char charArray[]; // 문자 배열
            String stringArray[]; // 문자열 배열
      • 배열 생성
        • new 명령어로 생성하고 몇개를 담을지 정의하는 것
      • 배열 순회
        • 배열 안에 있는 변수(숫자나 글자)에서 원하는 것을 꺼내는 것
        • for문으로 배열 안에 있는 변수를 모두 출력해볼 수도 있음
        • .length() 메서드로 배열의 길이값을 알 수 있음
        • 배열 초기화 방법
          • 중괄호를 사용 {}
          • 반복문 for문을 사용
          • Array.fill 메소드를 사용해서 초기화
      • 복사
        • 얕은 복사
          • 주소 값만 복사되고 실제 값은 유지되는 것
        • 깊은 복사
          • 진짜 새로운 배열을 만들고 싶을 때 사용
          • for문과 같은 바복문을 통해서 복사하는 방법과  Arrays.copy0f() 메서드를 사용한 방법이 있음
    • String 배열
      • 문자열 배열이며 선언하고 생성하는 방법은 기존 배열과 동일
      • char는 문자고 String은 문자열
        • String = char[]
    • 다차원 배열
      • 생성방법
        • int[][] array = new int [][];
      • 가변 배열
        • 행마다 다른 길이의 배열을 저장
      • 3차원 배열
        • int[][][] multiArrary
더보기
더보기
// 중괄호를 사용해 초기화

int[][] array = {
	{1, 2, 3},
	{4, 5, 6}
};

// 반복문을 통한 초기화

int[][] array = new int[2][3]; // 최초 선언

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        arr[i][j] = 0;  // i, j 는 위 노란색 네모박스 안에있는 숫자를 의미하며 인덱스 라고 부릅니다.
    }
}

// 가변 배열

// 선언 및 초기화
int[][] array = new int[3][];
// 배열 원소마다 각기다른 크기로 지정 가능합니다.
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];

// 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
int[][] array2 = {
    {10, 20},
    {10, 20, 30, 40},
    {10}

};

// 3차원 배열의 이해

// 중괄호 3개를 써서 3차원 배열 초기화를 할 수 있습니다.
int[][][] MultiArray = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
  • 컬렉션 (List, Queue, Set, Map)
    • 컬렉션의 종류
      • List : 순서가 있는 데이터의 집합이며 데이터 중복을 허용
        • ArrayList : 배열처럼 일렬로 데이터를 저장하고 조회, 순번값으로 값을 하나씩 조회
        • LinkedList : 메모리에 남는 공간을 요청해서 여기저기 실제 값을 담아놓고
                              실제 값이 있는 주소값으로 목록을 구성 및 저장
        • Stack : 바구니에 처음 넣은 물건을 맨 마지막에 꺼낼 수 있듯 First in Last out > FILO
      • Queue : 처음 넣은 것이 가장 처음 나옴 First in First out > FIFO
      • Set : 순서가 없는 데이터의 집합이며 데이터 중복 허용 안함
      • Map : 순서가 없는 (Key, Value) 쌍으로 이루어진 데이터의 집합이며 Key값 중복 허용 안함
    • 컬렉션의 변수
      • 컬렉션은 참조형 변수를 저장함 (기본형X)
        • Integer, Long, Double, String
  • 길이 값 가져오기
    • length : 배열의 길이 조희
    • length() : 문자열의 길이 조회
    • size() : 컬렉션 타입 목록의 길이 조회

 


2.[Java 문법 종합반] 3주차 : 클래스, 상속, 인터페이스

  • 객체지향 프로그래밍 이해 (객체, 클래스)
    • 객체
      • 객체란 ?
        • 식별가능한거
      • 객체간의 관계
        • 사용관계 : 사람은 자동차를 사용
        • 포함관계  : 타이어는 자동차에 포함
        • 상속관계 : 공장은 자동차랑 기차를 만드므로 기계시스템을 상속 받음
    • 객체지향 프로그래밍의 특징
      • 캡슐화
      • 상속
      • 다형성
      • 추상화
    • 클래스
      • 클래스란?
        • 설계도에 해당
      • 인스턴스
        • 클래스를 토대로 생성된 객체를 해당 클래스의 인스턴스라고 부르며 이 과정을 인스턴스화라고 부름
  • 클래스 설계
    • 1. 설계도 선언(클래스 선언)
    • 2. 속성(필드) 정의
    • 3. 생성 방식 정의(생성자)
    • 4. 행위(메서드) 정의

 

  • 객체 생성과 참조형 변수 (객체생성, 참조형 변수, 객체 배열)
    • 객체생성
      • 객체생성 연산자인 new를 사용하여 클래스로부터 객체 생성
      • new Car(); // Car클래스 객체 생성
    • 참조형 변수
      • new연산자를 통해 객체가 생성되면 해당 인스턴스의 주소가 반환되므로 참조형 변수를 사용하여 받아줄 수 있음
      • Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
        Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
    • 객체 배열
      • 객체는 참조형 변수와 동일하게 취급
      • 배열 또는 컬렉션에도 저장하여 관리할 수 있음

 

  • 객체의 속성 : 필드 (필드, 필드의 초기값, 필드 초기화)
    • 필드
      • 필드는 객체의 데이터를 저장하는 역할
    • 필드의 초기값과 초기화
      • 초기값을 제공하는 방법은 ‘필드 타입 필드명 = 값;’ 이렇게 직접 초기화
      • String model = "Gv80";

 

  • 객체의 행위 : 메서드 (메서드 선언, 메서드 호출, 메서드 오버로딩, 기본형&참조형 매개변수)
    • 메서드란?
      • 객체의 행위를 뜻하며 객체간의 협력을 위해 사용
    • 메서드 선언
      • 리턴타입 메서드명(매개변수, ...) { 실행할 코드 작성 }
    • 메서드 호출
      • 메서드의 블록 내부에 작성된 코드를 실행
        • 외부 접근
        • 내부접근
        • 반환 값 저장
    • 메서드 오버로딩
      • 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의
    • 기본형&참조형 매개변수
      • 기본형 매개변수
        • 전달할 매개값으로 지정한 값을 메서드의 매개변수에 복사해서 전달
      • 참조형 매개변수
        • 전달할 매개값으로 지정한 값의 주소를 매개변수에 복사해서 전달

 

  • 인스턴스 멤버와 클래스 멤버  (인스턴스 멤버, 클래스 멤버, 지역변수,  final 필드와 상수)
    • 인스턴스 멤버
      • 인스턴스 멤버는 객체를 생성해야 사용
      • 객체의 인스턴스 필드는 각각의 인스턴스마다 고유하게 값을 가질 수 있음
    • 클래스 멤버
      • Java의 클래스 로더에 의해 메서드 영역에 저장되고 사용
      • 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버를 의미
      • 객체의 생성 필요 없이 바로 사용이 가능
    • 지역변수
      • 메서드 내부에 선언한 변수를 의미
      • 메서드가 실행될 때마다 독립적인 값을 저장하고 관리
      • 지역 변수는 메서드 내부에서 정의될 때 생성되어 메서드가 종료될 때까지만 유지
    • final
      • final 필드는 초기값이 저장되면 해당값을 프로그램이 실행하는 도중에는 절대로 수정할 수 없음
      • final 필드는 반드시 초기값을 지정

 

  • 생성자 (생성자 선언, 생성자 호출, 기본 생성자, 필드 초기화와 생성자 오버로딩)
    • 생성자 선언 및 호출
      • 생성자는 객체가 생성될 때 호출되며 객체를 초기화하는 역할을 수행
    • 기본 생성자
      • 기본 생성자는 선언할 때 괄호( ) 안에 아무것도 넣지 않는 생성자를 의미
    • 필드 초기화
      • 객체를 만들 때 인스턴스마다 다른 값을 가져야 한다면 생성자를 통해서 필드를 초기화할 수 있음
      • 반대로 인스턴스마다 동일한 데이터를 가지는 필드는 초기값을 대입하는 것이 좋음
    • 생성자 오버로딩
      • 생성자를 통해 필드를 초기화할 때 오버로딩을 적용할 수 있음

 

  • this, this() (this, this())
    • this
      • this는 객체 즉, 인스턴스 자신을 표현하는 키워드
      • 객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용
    • this()
      • this(…)는 객체 즉, 인스턴스 자신의 생성자를 호출하는 키워드

 

  • 접근 제어자 (접근 제어자, Getter, Setter, 제어자의 조합)
    • 접근제어자
      • public
      • protected
      • default
      • private
      • static
      • final
      • abstract
    • Getter
      • 외부에서 객체의 private 한 필드를 읽을 필요가 있을 때 Getter 메서드를 사용
      • 메서드 이름의 규칙은 : get + 필드 이름(첫 글자 대문자)
    • Setter
      • 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 Setter 메서드를 사용
      • 메서드 이름의 규칙은 : set + 필드 이름(첫 글자 대문자)
    • 제어자의 조합
      • - 클래스 : public, default, final, abstract
        - 메서드 : public, protected, default, private, final, abstract, static
        - 멤버 변수 : public, protected, default, private, final, static
        - 지역변수 : final

 

  • 패키지, import (package, import)
    • package 
      • 패키지란 클래스의 일부분이면서 클래스를 식별해 주는 용도
      • 패키지는 상위 패키지와 하위 패키지를 도트(.)로 구분
      • Java는 패키지의 경로를 통해 이를 구분
    • import
      • 다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드
      • 서로 다른 패키지에 있는 같은 이름의 클래스를 동시에 사용하려면 해당 클래스에 패키지 명을 전부 명시

 

  • 상속 (상속, 클래스 간 관계, 단일상속, 다중상속, final 클래스, final 메서드, object)
    • 상속
      • 상속의 사전적 정의는 부모가 자식에게 물려주는 행위
      • 객체 지향 프로그램에서도 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있음
      • 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가하여 생산성과 유지 보수성에 매우 유리
      • 클래스 간의 상속은 extends 키워드를 사용하여 정의
    • 클래스 간 관계
      • 상속관계
        • ~은 ~이다
        • 고래는 포유류다.
      • 포함관계
        • ~은 ~을 가지고 있다.
        • 자동차는 문을 가지고 있다.
    • 단일상속과 다중상속
      • Java는 다중 상속을 허용하지 않음
      • 다중 상속을 허용하면 클래스 간의 관계가 복잡해지는 문제
    • final 클래스, final 메서드
      • 클래스에 final 키워드를 지정하여 선언하면 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스
      • 메서드에 final 키워드를 지정하여 선언하면 최종적인 메서드가 됨으로 더 이상 오버라이딩할 수 없는 메서드

 

  • 오버라이딩 (오버라이딩, super, super())
    • 오버라이딩
      • 부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것을 오버라이딩
      • 아래 조건을 만족해야 함
        • 1. 선언부가 부모 클래스의 메서드와 일치
        • 2. 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없음
        • 3. 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없음
    • super
      • super는 부모 클래스의 멤버를 참조할 수 있는 키워드
      • 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용
      • 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 이를 구분하기 위해 사용
    • super()
      • super(…)는 부모 클래스의 생성자를 호출할 수 있는 키워드
      • 객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스의 생성자를 호출하기 위해 사용
      • 자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져서 하나의 인스턴스가 생성
      • 부모 클래스의 멤버들의 초기화 작업이 먼저 수행이 되어야 함
        • 따라서 자식 클래스의 생성자에서는 부모 클래스의 생성자가 호출
        • 또한 부모 클래스의 생성자는 가장 첫 줄에서 호출

 

  • 다형성 (참조변수의 타입 변환, 다형성, instanceof)
    • 참조변수의 타입변환
      • 자동 타입 변환
        • 부모 타입 변수 = 자식 타입 객체; 는 자동으로 부모 타입으로 변환이 일어남
      • 강제 타입 변환
        • 부모 타입 객체는 자식 타입 변수로 자동으로 타입 변환되지 않음
        • 타입 변환 연산자를 사용하여 강제로 자식 타입으로 변환할 수 있음
    • 다형성
      • 여러 가지 형태를 가질 수 있는 능력
      • 참조 변수 타입 변환을 활용해서 다형성을 구현할 수 있음
    • instanceof
      • 다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이때 사용할 수 있는 명령어