기록양식 (TIL)
1. 사용 개념
2. 의문점 or 문제
3. 시도해 본 것들(+응용) or 삽질
4. 해결
5. 알게 된 점(회고)
1. 객체지향언어
2. 클래스와 객체
3. 변수와 메서드
4. 오버로딩
5. 생성자
6. 변수의 초기화
7. 상속
8. 오버라이딩
9. package와 import
10. 제어자
11. 다형성
12. 추상클래스
13. 인터페이스
14. 내부 클래스
실제 세계를 어떻게
소프트웨어
세계로 구현을 할까?ex) 미사일의 각도와 궤도를 어떻게 정밀하게 할까? > 소프트웨어에서 정밀하게 구현, 시뮬레이션
클래스 : 설계도
객체 = 속성(변수) + 기능(메서드)
클래스 👉 객체 : 클래스로부터 객체를 만드는 것 : 인스턴스화 , 객체 = 인스턴스
Q . 클래스가 왜 필요할까?
A . 객체를 생성하기 위해서
Q . 객체가 왜 필요할까?
A . 객체를 사용하기 위해서
Q . 객체를 사용한다는 것은?
A . 객체가 가진 속성과 기능을 사용하려고
하나의 소스 파일에 여러 클래스가 있다면?
소스파일의 이름이 Public class와 일치
다른 클래스는 상관 없음 / public은 하나의 소스파일에 하나씩 / 대소문자 구분
객체의 사용과정
- 클래스 작성(설계도) > 2. 객체생성(제품) > 3. 객체사용 (제품의 사용)
- 객체 생성 - 생성한 객체를 연산자를 통해 참조변수에 연결 /
TV t1 = new TV();
객체(각 인스턴스)의 속성은 다른 값을 가질 수 있지만, 기능은 공통된 값을 가진다.
참조변수 = 하나의 값(인스턴스)만 저장이 가능하다. 하나의 인스턴스에 여러개의 참조변수는 가능하다.
TV tvArr = new TV[3];
객체의 배열 == 참조변수의 배열
객체의 배열을 만든 뒤 , tvArr[0~2] = new tv(); 총 3개, 각 인덱스 별로 값을 저장해줘야 사용 가능.
클래스 == 데이터 + 함수
클래스 : 설계도 / 데이터 + 함수 / 사용자 정의 타입 = 총 3가지
변수(하나의 데이터 저장) 👉 배열(같은 종류의 여러데이터를 하나로 저장) 👉 구조체(서로 관련된 여러데이터를 하나로 저장) 👉 클래스 : 데이터와 함수의 결합 (구조체 + 함수)
사용자 정의
ex) 시, 분, 초를 배열로 만든다면 같은 시간은 시간끼리, 분은 분끼리, 초는 초끼리 묶인다.
시,분,초를 클래스로 묶어서 time으로 만들면 관련된 데이터끼리 묶을 수 있다.
클래스 영역 : 클래스변수(cv) / 인스턴스변수(iv)
메서드 영역 : 지역변수
![]() | ![]() |
---|
클래스 변수 : 공통적으로 가지고 있는 특성 - 카드의 가로,세로
인스턴스 변수 : 개별적으로 가지고 있는 특성 - 카드의 그림, 숫자
iv = 객체 생성이 필요 / cv = 객체 생성x , 아무때나 생성 가능 / 객체 = iv를 묶은 것
메서드 : 문장들을 묶어 놓은 것 / 작업단위로 묶어서 이름을 붙인 것
함수 = 메서드 유사하나, 메서드는 클래스 내에만 존재한다.
return문은 현재 메서드를 종료하고 호출한 메서드로 돌아간다.
반환타입이 void가 아닐 경우 필수로 추가해야한다.
![]() | ![]() |
---|
왼쪽 중간의 call stack 부분이 오른쪽의 call stack(호출 스택)의 방식처럼 진행
메서드 실행(호출 스택) > 실행된 메서드는 종료되면 > 사라짐
호출 스택내에서 휘발성으로 사라지기 때문에 지역변수(lv) 또한 그 메서드 내에서만 존재
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)
![]() | ![]() |
---|
![]() | ![]() |
---|
메서드 내부에서 자기자신을 다시 호출
why? 반복문, 조건문을 길게 쓰는 대신 > 간결하게 사용
재귀호출은 조건문이 필수적으로 필요, 그렇지 않으면 무한루프에 빠짐
인스턴스 메서드
인스턴스 생성 후, "참조변수.메서드" > 호출
인스턴스 멤버(iv, im) 관련된 작업
메서드 내에서 인스턴스 iv 사용 가능
static(클래스) 메서드
객체 생성 없이 "클래스이름, 메서드" > 호출
인스턴스 멤버(iv, im)과 관련없는 작업
iv 사용불가 >> lv 매개변수 사용
메서드 내 인스턴스변수가 없다면, static변수를 사용하여 호출시간을 줄이고 효율성을 높이기
객체가 있는 iv를 쓰면 > 인스턴스 메서드
객체가 없는, iv를 쓰지 않으면 > static 메서드
같은 클래스 내에서 구별되기 위해 변수처럼 메서드 또한 각각의 다른이름을
가져야 하지만, 오버로딩을 쓰면 하나의 메서드로 기능을 수행
조건-
메서드 이름이 같아야 한다.
매개 변수의 개수 또는 타입이 달라야한다.
반환타입은 영향 없다.
생성자 : 인스턴스 초기화 메서드
인스턴스가 생성될 때마다 호출
인스턴스 생성시 수행할 작업(iv 초기화)에 사용
생성자의 이름은 클래스와 같아야 한다.
생성자는 리턴값이 없다.
모든 클래스는 반드시 생성자를 가져야 한다.
기본생성자
-매개변수가 없는 생성자
-생성자가 하나도 없을 때 컴파일러가 자동으로 추가
![]() | ![]() |
---|
매개변수가 있는 생성자
-매개변수로 초기화
![]() | ![]() |
---|
this() = 생성자
1. 같은 클래스 내, 생성자에서 다른 생성자 호출 할 때
2. 다른 생성자 호출, 첫 줄에서만 가능
this = 참조변수
1. 인스턴스 자신을 가리키는 변수 (평소에는 자동 생략)
2. 인스턴스 메서드 내에서 활용
3. lv,iv 구별할 때
4. static(클래스)에선 사용불가
지역변수(lv)는 사용 전에 꼭 수동 초기화를 해야한다.
인스턴스변수(iv)는 자동 초기화
멤버변수 (iv,cv) 자동 초기화
지역변수는 호출스택 내에 있기 때문에, 수동 초기화로 덮어씌어줘야 한다.
초기화의 종류는
자동 초기화 / 간단 초기화 / 복잡 초기화멤버변수 명시적 초기화 (= 대입연산자) =
단순
-int door =4
-Engine e = new Engine(); / 뒤에 참조형 주소까지 같이 생성하기 (Engin e, 만 있을 경우 null 만 존재)
초기화 블럭 =
복잡
-인스턴스 초기화 블럭 : {}
-클래스 초기화 블럭 : static {}
생성자 =
복잡
-iv 초기화, 복잡한 초기화
멤버변수의 초기화 시점
클래스 변수 : 클래스가 처음 로딩될 때, 단 한번
인스턴스 변수 : 인스턴스가 생성될 때마다
순서: cv > iv > 각 단계에서 자동 초기화 > 단순 > 복잡