10월 13일

Yullgiii·2023년 10월 13일
0
post-thumbnail

내일 배움 캠프

오늘도 어제에 이어 자바 문법을 들을것인데 목표는 4주차까지 들어보는것이지만 가능하련지는 솔직히 잘 모르겠다...나중에 핸드폰 이슈가 있을수도 있고 해서...좀 잘 모르겠다.
하지만 그래도 도전한다 강의듣기!!!!!!!!!!!

Java

가장 헷갈리던 정의 얕은 복사, 깊은 복사!


그림으로 설명해주셨다
정리를 해보면
arr1을 설정하고
이제 두번째 배열에서 arr2=arr1을 해주면 저 초록색의 전체값이 복사되는것이 아닌 그저 arr1의 주소만 복사가 되어서 arr2를 수정하면 arr1에도 영향을 받을수 있다!!!
그것이 얕은 복사!!!

  • 주소값만 복사된다는건 변수명은 서로 다르지만 같은 값을 보고 있다는것을 뜻해요.
  • 비유하자면 내가 가진 핸드폰, PC 로 각각 카카오톡에 로그인해도 나의 카톡 계정은 1개인것처럼, 변수명은 여러개지만 결국 실제값은 1개인것과 같다고 보시면 됩니다.

값을 가지는게 아니라 똑같은 주소만 바라보고 있는것이다!

깊은 복사 (.clone)

// 깊은 복사

int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length]; 

for (int i = 0; i < a.length; i++) {
    b[i] = a[i]; // 깊은 복사
}

b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)

System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.

for 문을 이용해서 하나하나 끄집어 내서 복사를 해줌으로서 a와는 다른 별도의 b라는 배열이 생성됨

// 깊은 복사 메서드

// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법입니다. 

위의 내용이 가장 간단하지만!!!
2차원이상 배열에서는 얕은 복사로 동작한다고 한다 그래서 밑의 코드가 최종이다!!!

// 깊은 복사 메서드

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		// 2. Arrays.copyOf() 메서드
		int[] a = { 1, 2, 3, 4 };
		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
	}
}

String배열

문자열 = 문자배열 string = char []
기본형 변수는 소문자로 시작하고 참조형 변수는 대문자로 시작!!!!
와 이걸 이제야 알았네...?
또한 기본형 변수는 값 자체를 저장하지만 참조형은 별도의 공간에 값을 저장 후 그 주소를 저장(=주소형 변수)

String 기능 활용

메서드응답값 타입설명
length()int문자열의 길이를 반환한다.
charAt(int index)char문자열에서 해당 index의 문자를 반환한다.
substring(int from, int to)String문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다. (to는 범위에 포함되지 않음)
equals(String str)boolean문자열의 내용이 같은지 확인한다. 같으면 결과는 true, 다르면 false가 된다.
toCharArray()char[]문자열을 문자배열(char[])로 변환해서 반환한다.
new String(char[] charArr)String문자배열(char[]) 을 받아서 String으로 복사해서 반환한다.

char < String 훨씬 많이 씀

// String 기능 활용하기

String str = "ABCD";

// length()
int strLength = str.length();
System.out.println(strLength);  // 4 출력

// charAt(int index)
char strChar = str.charAt(2); // 순번은 0부터 시작하니까 2순번은 3번째 문자를 가리킵니다.
System.out.println(strChar);  // C 출력

// substring(int from, int to)
String strSub = str.substring(0, 3); // 0~2순번까지 자르기 합니다. (3순번은 제외)
System.out.println(strSub);  // ABC 출력

// equals(String str)
String newStr = "ABCD";  // str 값과 같은 문자열 생성
boolean strEqual = newStr.equals(str);
System.out.println(strEqual); // true 출력

// toCharArray()
char[] strCharArray = str.toCharArray(); // String 을 char[] 로 변환

// 반대로 char[] 를 String로 변환하는 방법
char[] charArray = {'A', 'B', 'C'};
String charArrayString = new String(charArray); // char[] 를 String 으로 변환

다차원 배열

  • int[][] array
  • int array[][]
  • int[] array[]
    등으로 선언
    배열안에 배열안에 배열안에 배열 같은 느낌

컬랙션!!고도화된 자료구조

컬렉션기능 : 크기 자동조정/ 추가/ 수정/ 삭제/ 반복/ 순회/ 필터/ 포함확인 등….

  • 컬렉션종류 !중요!기억!
    • Collection 에는 List, Set , Queue , Map 이 있습니다.
    • List : 순서가 있는 데이터의 집합 (데이터 중복 허용) - 배열과 비슷
    • Queue : 빨대처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합
      • First In First Out : 먼저들어간 순서대로 값을 조회할 수 있다 FIFO.
        정말 많이 사용되는 자료구조
    • Set : 순서가 없는 데이터의 집합 (데이터 중복 허용 안함) - 순서없고 중복없는 배열
    • Map : 순서가 없는 (Key,Value) 쌍으로 이루어진 데이터의 집합 (Key값 중복 허용 안함)

List

arrat list
순서가 있는 데이터의 집합 (like arr!)
다른점은 길이를 몰라도 만들수 있음!
생성 시점에 작은 연속된 공간을 요청해서 참조형 변수를 담아놓는다

  • Array은 메모리에 연속된 공간을 요청한 사이즈 만큼 받아서 실제값을 저장하는 기본형 변수로 저장하기 때문에 정적배열
  • ArrayList 는 생성시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아놓고, 값이 추가될때 더 큰 공간이 필요하면 더큰 공간을 받아서 저장하기 때문에 동적배열
  • 기능
    • 선언 : ArrayList<Integer> intList 형태로 선언
    • 생성 : new ArrayList<Integer>(); 형태로 생성
    • 초기화 : 사이즈를 지정하는것이 없기 때문에 초기화가 필요X
    • 값 추가 : intList.add({추가할 값}) 형태로 값을 추가
    • 값 수정 : intList.set({수정할 순번}, {수정할 값}) 형태로 값을 수정
    • 값 삭제 : intList.remove({삭제할 순번}) 형태로 값을 삭제
    • 전체 출력 : intList.toString() 형태로 전체 값을 대괄호[]로 묶어서 출력
    • 전체 제거 : intList.clear() 형태로 전체 값을 삭제

linked list
메모리에 남는 공간을 요청해서 여기저기 나누어서 실제값을 담아놓고, 실제값이 있는 주소값으로 목록을 구성하고 저장
기본적인 기능은 ArrayList 와 동일 LinkedList 는 값을 나누어 담기 때문에 모든값을 조회하는 속도가 느린 대신 값을 중간에 추가하거나 삭제할때는 속도가 빠르다.

  • 기능
    • 선언 : LinkedList<Integer> linkedList 형태로 선언
    • 생성 : new LinkedList<Integer>(); 형태로 생성
    • 초기화 : 사이즈를 지정하는것이 없기 때문에 초기화가 필요X
    • 값 추가 : linkedList.add({추가할 값}) 형태로 값을 추가
    • 값 중간에 추가 : linkedList.add({추가할 순번}, {추가할 값}) 형태로 값을 중간에 추가
    • 값 수정 : linkedList.set({수정할 순번}, {수정할 값}) 형태로 값을 수정
    • 값 삭제 : linkedList.remove({삭제할 순번}) 형태로 값을 삭제
    • 전체 출력 : linkedList.toString() 형태로 전체 값을 대괄호[]로 묶어서 출력
    • 전체 제거 : linkedList.clear() 형태로 전체 값을 삭제

Stack

수직으로 값을 쌓아두고 넣었다 뺸다 바구니 느낌
넣는 기능(push()) 과 조회(peek()), 꺼내는(pop()) 기능만 존재

  • 기능
    - 선언 : Stack<Integer> intStack 형태로 선언
    - 생성 : new Stack<Integer>(); 형태로 생성
    - 추가 : intStack.push({추가할 값}) 형태로 값을 추가
    - 조회 : intStack.peek() 형태로 맨 위값을 조회
    - 꺼내기 : intStack.pop() 형태로 맨 위값을 꺼냄 (꺼내고나면 삭제됨)
    최근 저장된 데이터 나열이나 데이터의 중복을 막고싶을 때 사용

Queue

먼저들어간 순서대로 값을 조회할 수 있다.
기능(add()), 조회(peek()), 꺼내는(poll()) 기능만 존재
생성자가 존재하는 클래스인 LinkedList 를 사용하여 Queue 를 생성

// LinkedList 를 생성하면 Queue 기능 (Queue 가 부모/ LinkedList 가 자식이기 떄문)
Queue<Integer> intQueue = new LinkedList<Integer>();

기능

  • 선언 : Queue<Integer> intQueue 형태로 선언.
  • 생성 : new LinkedList<Integer>(); 형태로 생성
  • 추가 : intQueue.add({추가할 값}) 형태로 값을 맨 위에 추가
  • 조회 : intQueue.peek() 형태로 맨 아래값을 조회
  • 꺼내기 : intQueue.poll() 형태로 맨 아래값 (꺼내고나면 삭제됨)

Set 집합과 닮아있다.

순서가 없는 데이터의 집합 (데이터 중복 허용 안함) - 순서없고 중복없는 배열
순서가 보장되지 않는 대신 중복을 허용하지 않도록 유지
그냥 쓸수있지만 HashSet, TreeSet 등으로 응용해서 사용가능
생성자가 존재하는 클래스인 HashSet 를 사용하여 Set 를 생성

  • 기능
    • 선언 : Set<Integer> intSet 형태로 선언
    • 생성 : new HashSet<Integer>(); 형태로 생성
    • 추가 : intSet.add({추가할 값}) 형태로 값을 맨 위에 추가
    • 조회 : intSet.get({초회할 순번}) 형태로 순번에 있는 값을 조회
    • 삭제 : intSet.remove({삭제할 값}) 형태로 삭제할 값을 직접 지정
    • 포함확인 : intSet.contains({포함확인 할 값}) 형태로 해당값이 포함되어있는지 boolean 값으로 응답

Map

key - value pair 중요!!!
key-value 형태로 데이터를 저장하기 때문에 기존에 순번으로만 조회하던 방식에서, key 값을 기준으로 vlaue를 조회
Map 은 그냥 Map으로 쓸수도있지만 HashMap, TreeMap등으로 응용하여 사용
기능

  • 선언 : Map<String, Integer> intMap 형태로 Key타입과 Value타입을 지정해서 선언
  • 생성 : new HashMap<>(); 형태로 생성
  • 추가 : intMap.put({추가할 Key값},{추가할 Value값}) 형태로 Key에 Value값을 추가
  • 조회 : intMap.get({조회할 Key값}) 형태로 Key에 있는 Value값을 조회
  • 전체 key 조회 : intMap.keySet() 형태로 전체 key 값들을 조회
  • 전체 value 조회 : intMap.values() 형태로 전체 value 값들을 조회
  • 삭제 : intMap.remove({삭제할 Key값}) 형태로 Key에 있는 Value값을 삭제

length vs length() vs size() - 길이값 가져오기

1. length

  • arrays(int[], double[], String[])
  • length는 배열의 길이를 조회해줍니다.

2. length()

  • String related Object(String, StringBuilder etc)
  • length()는 문자열의 길이를 조회해줍니다. (ex. “ABCD”.length() == 4)

3. size()

  • Collection Object(ArrayList, Set etc)
  • size()는 컬렉션 타입목록의 길이를 조회해줍니다.

2주차 숙제!!!

자료구조 요리 레시피 메모장 만들기

  • 입력값
    • 저장할 자료구조명을 입력합니다. (List / Set / Map)
    • 내가 좋아하는 요리 제목을 먼저 입력합니다.
    • 이어서 내가 좋아하는 요리 레시피를 한문장씩 입력합니다.
    • 입력을 마쳤으면 마지막에 “끝” 문자를 입력합니다.
  • 출력값
    • 입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
    • 이어서, 입력한 모든 문장앞에 번호를 붙여서 입력 순서에 맞게 모두 출력 해줍니다.

ex) 입력 예시

Set
백종원 돼지고기 김치찌개 만들기
돼지고기는 핏물을 빼주세요.
잘익은 김치 한포기를 꺼내서 잘라주세요.
냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
다진마늘 한스푼, 설탕 한스푼 넣어주세요.
종이컵으로 물 8컵 부어서 센불에 끓여주세요.
핏물 뺀 돼지고기를 넣어주세요.
된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
중불로 줄여서 오래 끓여주세요~!!	
마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^

예시 출력

[ Set 으로 저장된 백종원 돼지고기 김치찌개 만들기 ]
1. 돼지고기는 핏물을 빼주세요.
2. 잘익은 김치 한포기를 꺼내서 잘라주세요.
3. 냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
4. 다진마늘 한스푼, 설탕 한스푼 넣어주세요.
5. 종이컵으로 물 8컵 부어서 센불에 끓여주세요.
6. 핏물 뺀 돼지고기를 넣어주세요.
7. 된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
8. 간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
9. 중불로 줄여서 오래 끓여주세요~!!	
10. 마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^

나의 답

음 뭔자 1주차 숙제랑 같은 느낌인걸???/

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class homework02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("저장할 자료구조명을 입력하세요 (List/Set/Map): ");
        String structureType = sc.nextLine();

        System.out.print("요리 제목을 입력하세요: ");
        String recipeTitle = sc.nextLine();

        List<String> recipeSteps = new ArrayList<>();
        System.out.println("레시피를 한문장씩 입력하세요. (끝을 입력하면 종료): ");

        while (true) {
            String step = sc.nextLine();
            if (step.equals("끝")) {
                break;
            }
            recipeSteps.add(step);
        }

        System.out.println("[ " + structureType + " 으로 저장된 " + recipeTitle + " ]");
        for (int i = 0; i < recipeSteps.size(); i++) {
            System.out.println((i + 1) + ". " + recipeSteps.get(i));
        }
    }
}

3주차로 넘어가요!!!!

객체지향 프로그래밍 이해하기

솔직히 이부분은 내가 나도코딩님과 얄코님의 강의를 들으며 젤 이해가 안갔고 가장 많은 시간을 투자한 부분이라 이해부분은 내가 새로 배우는것은 없을듯 하다 확실히 기초를 잘 기억해야하는데
그것을 못했던지라 들어도 들어도 새로운 느낌이지만 이 부분은 이해가 조금 있는 편이라 좀 빠르게 듣고 넘기려한다!
그래도 그중 중요한 점은 메모를 해둬보도록 하자

속성 = 필드
행위 = 메서드

자동차의 예제는 어딜 가든 나오는 예제구먼
객체 = 인스턴스

클래스 설계

  1. 만들려고 하는 설계도를 선언합니다.(클래스 선언)
  2. 객체가 가지고 있어야할 속성(필드)을 정의합니다.
  3. 객체를 생성하는 방식을 정의합니다.(생성자)-constructor
  4. 객체가 가지고 있어야할 행위(메서드)를 정의합니다.


아직 메인 클래스를 만들지 않아서 사용위치가 0이지만 사용위치가 생긴다면!!!

이런식으로 사용위치가 뜨는 아름다운 인텔리제이!!!고마워!!!
new 키워드!!만들어둔 생성자를 호출한다 라고 볼수있다.!!

필드와 메서드!!

내가 좀 햇갈리는 부분이다 그러니 좀 잘 정리해보자

필드


선언은 했지만 할당은 안했을때의 기본 값들
| 데이터 타입 | 기본값 |
| --- | --- |
| byte | 0 |
| char | \u0000 (공백) |
| short | 0 |
| int | 0 |
| long | 0L |
| float | 0.0F |
| double | 0.0 |
| boolean | false |
| 배열 | null |
| 클래스 | null |
| 인터페이스 | null |

필드를 사용한다 라는 의미는 필드의 값을 변경하거나 읽는 것을 의미!!!!!

  • 우리가 클래스에 필드를 정의하여 선언했다고 해서 바로 사용할 수 있는 것은 아닙니다.(인스턴스화를 해야지 사용가능)
  • 클래스는 설계도일 뿐 실제로 필드의 데이터를 가지고 있는 것은 객체입니다.
  • 따라서 객체를 생성한 후에 필드를 사용할 수 있습니다.

외부 접근은 도트(.) 연산자를 사용 ex)car.color = "blue";

내부접근

double brakePedal() {
    speed = 0;
    return speed;
}

메서드


리턴 타입

double brakePedal() {...} // double 타입 반환
char changeGear(char type) {...} // char 타입 반환
boolean onOffLights() {...} // boolean 타입 반환
void horn() {...} // 반환할 값 없음

반환할 값이 없을 때는 리턴타입에 void를 작성
메서드는 실행할 때 return문을 만나면 그대로 종료하게 되는데 void 타입일 때 return; 이렇게 return문을 사용하여 원하는 지점에서 메서드를 종료

매개변수 중요(시스템의 인풋)

double gasPedal(double kmh, char type) {
    speed = kmh;
    return speed;
}

매개변수는 메서드를 호출할 때 메서드로 전달하려는 값을 받기 위해 사용되는 변수
해당 매개변수에 값을 전달하기 위해서는 순서와 타입에 맞춰 값을 넣어!!!!!

메서드 호출방법!!!!!!
생성만 하고 호출을 안하면 그저 글자쪼가리!!!

‘메서드를 호출한다’ 라는 의미는 메서드의 블록 내부에 작성된 코드를 실행한다는 의미입니다.

  • 필드와 마찬가지로 클래스의 메서드를 정의하여 선언했다고 해서 바로 사용X
  • 클래스는 설계도일 뿐 메서드는 객체의 행위를 정의
  • 따라서 객체를 생성한 후에 메서드를 사용

외부접근

  • Car car = new Car();

객체의 내부 메서드에 접근하는 방법은 도트(.) 연산자를 사용하면 됩니다.

  • car.brakePedal();

매개변수를 가지고 있다면 반드시 호출할 때 매개변수의 순서와 타입에 맞게 매개값을 넣어

  • car.gasPedal(100, 'D');

  • 내부 접근

        double gasPedal(double kmh, char type) {
            changeGear(type);
            speed = kmh;
            return speed;
        }
  • gasPedal(double kmh, char type) 메서드 내부에서 해당 객체의 changeGear(type); 메서드를 호출

메서드 오버로딩(오버라이딩 아님)

함수가 하나의 기능만을 구현하는것이 아니라 하나의 메서드 이름으로 여러 기능을 구현

  • 오버로딩의 조건
    • 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라함
    • '응답 값만' 다른 것은 오버로딩X
    • 접근 제어자만 다른 것도 오버로딩X
    • 결론, 오버로딩은 매개변수의 차이로만 구현
  • 오버로딩의 장점
    1. 메서드 이름 하나로 상황에 따른 동작을 개별로 정의
      1. 예를들면 메세지 출력할때 쓰는 println()
      2. println() 의 매개변수로는 int, double, String, boolean 등 다양하게 넣을 수 있다
    2. 메서드의 이름을 절약할 수 있다
      1. 만약 오버로딩이 안된다면 println()printlnInt(), printlnDouble() 처럼 메서드명이 길어지고 낭비 되었을 것

기본형과 참조형 매개변수

  • 기본형 매개변수

메서드를 호출할 때 전달할 매개값으로 지정한 값을 메서드의 매개변수에 복사해서 전달

  • 매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어가기 때문에 매개값으로 지정된 변수의 원본 값이 변경X

  • 참조형 매개변수
    메서드를 호출할 때 전달할 매개값으로 지정한 값의 주소를 매개변수에 복사해서 전달

    • 매개변수를 참조형으로 선언하면 값이 저장된 곳의 원본 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능
    • 메서드의 매개변수 뿐만 아니라 반환타입도 참조형
      • 반환타입이 참조형이라는 것은 반환하는 값의 타입이 “실제값의 주소”라는 의미

인스턴스 멤버와 클래스 멤버

멤버 = 필드 + 메서드

  • 인스턴스 멤버 = 인스턴스 필드 + 인스턴스 메서드
  • 클래스 멤버 = 클래스 필드 + 클래스 메서드

필드와 메서드는 선언하는 방법에 따라서 인스턴스 멤버와 클래스 멤버로 구분

클래스맴버
클래스는 Java의 클래스 로더에 의해 메서드 영역에 저장되고 사용

  • 클래스 멤버 선언
    • 필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드를 사용하면 됩니다.
      • 일반적으로 인스턴스마다 모두 가지고 있을 필요없는 공용적인 데이터를 저장하는 필드는 클래스 멤버로 선언하는 것이 좋습니다.
      • 또한 인스턴스 필드를 사용하지 않고 실행되는 메서드가 존재한다면 static 키워드를 사용하여 클래스 메서드로 선언하는 것이 좋습니다.

주의할 점

  • 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없습니다.
  • 반대로 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있습니다.
  • 클래스 멤버는 객체 생성없이 바로 사용 가능하기 때문에 객체가 생성되어야 존재할 수 있는 인스턴스 멤버를 사용할 수 없습니다

지역변수 및 상수

지역변수 : 해당 매서드가 실행될 때마다 독립적인 값을 저장하고 관리합니다.
지역 변수는 메서드 내부에서 정의될때 생성되어 메서드가 종료될 때까지만 유지
휘발성
↕️
전역변수

상수

final 필드는 반드시 초기값을 지정
필드 타입 앞에 final 키워드를 추가하여 final 필드를 선언
사용방법은 일반적인 인스턴스 필드와 동일 다만 수정이 불가능
상수!!=static final

생성자

생성자는 객체가 생성될 때 호출되며 객체를 초기화하는 역할을 수행
생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일
new 연산자에 의해 객체가 생성되면서 Car(); 즉, 생성자가 호출

기본 생성자
기본 생성자는 선언할 때 괄호( ) 안에 아무것도 넣지않는 생성자
모든 클래스는 반드시 생성자가 하나 이상 존재

생성자 오버로딩
생성자를 통해 필드를 초기화 할 때 오버로딩을 적용

주의할 점
오버로딩을 할 때 개수, 타입, 순서가 동일한데 매개변수명만 다르게 하는 경우는 오버로딩 규칙에 위배되기 때문에 오류가 발생

  • String, String, double : 매개변수의 개수, 타입, 순서가 동일하기 때문에 중복이 불가능합니다.

this 와 this() 난 이게 어려웠어...

this는 객체 즉, 인스턴스 자신을 표현하는 키워드
객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용
객체 내부 멤버에 접근할 때 this 키워드가 필수는 아니지만 상황에 따라 필수
생성자를 선언하는데 매개변수명과 객체의 필드명이 동일할 경우 오류가 발생하지는 않지만 생성자 블록 내부에서 해당 변수들은 객체의 필드가 아닌 가장 가까운 매개변수명을 가리키게 됨으로 자기 자신에게 값을 대입하는 상황이 됨
이럴 경우에 this 키워드를 사용하면 해결
그래서 이제는 쓸때 this.뭐뭐 라고 쓰기로 스앵님이랑 약속....

this(…)는 객체 즉, 인스턴스 자신의 생성자를 호출하는 키워드
객체 내부 생성자 및 메서드에서 해당 객체의 생성자를 호출하기 위해 사용
주의할 점
this() 키워드를 사용해서 다른 생성자를 호출할 때는 반드시 해당 생성자의 첫 줄에 작성

집중력이 깨진다,....
큰일이다
그래도 이까지는 듣고싶다
이까지는 들어야지!!!!!!!!!1

접근제어자!

제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여
접근 제어자 : public, protected, default, private
그 외 제어자 : static, final, abstract
드디어 이게 어따 쓰여지는지 알게 되는 파트구먼

  • 접근 제어자

멤버 또는 클래스에 사용, 외부에서 접근하지 못하도록 제한합니다.

  • 클래스, 멤버변수, 메서드, 생성자에 사용되고, 지정되어 있지 않다면 default 입니다.
    - public : 접근 제한이 전혀 없습니다.
    - protected : 같은 패키지 내에서, 다른 패키지의 자손클래스에서 접근이 가능
    - default : 같은 패키지 내에서만 접근이 가능
    - private : 같은 클래스 내에서만 접근이 가능
    필드마다 존재한다는것을 기억하기!

Getter 와 Setter 다음으로 넘어가기전에 이해해보자...

오늘은 여기까지는 해보자...

객체의 무결성 즉, 변경이 없는 상태를 유지하기 위해 접근 제어자를 사용

  • 외부에서 객체의 private 한 필드를 읽을 필요가 있을 때 Getter 메서드를 사용

  • 외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때 Setter 메서드를 사용

  • 사용가능한 제어자

    • 클래스 : public, default, final, abstract
    • 메서드 : public, protected, default, private, final, abstract, static
    • 멤버변수 : public, protected, default, private, final, static
    • 지역변수 : final

회고...

아 정말 마지막 8시부터는 너무 집중이 안되는 날이였다 어쩜 이러니...
왜 이리도 집중이 안되는 것이였을까 싶으면서도 금요일이라 약간 번아웃이 오는 느낌이려나 싶기도 하다 하지만 오늘 하루 배운거라도 머릿속으로 정리하며 글로 쓰고나니 뭔갈 많이 했는데 뭔갈 많이 안한 느낌도 드는게 사실이다...
복습이니까 그런느낌이 드나보다!!!!!!!!!!
후....다시금 달려야하는 다음주를 위해 오늘은 9시 칼퇴!!!!

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글