티스토리 뷰
AM
전체 인원 복습한 거 훑기
내가 뭘 배웠고
어디가 부족한지
기록하기
■ review
클래스는 대문자로 시작! 주어이기 때문에
클래스 안에 변수, 메소드 선언 > 내용들을 '필드'
한번만 선언 > 앞으로 여러번 사용하겠다(재사용)
하드웨어 중 메모리가 기억해야 사용할 수 있음
★생성자가 해당 필드를 메모리에 할당해주고, 그 주소값을 가져옴
생성자 != 메소드
리턴값이 주소값이기 때문에
리턴기능 제외하고 메소드와 기능 동일
매개변수를 받아와서 초기화 가능
클래스는 하나만 선언, 클래스에 접근하는 객체가 여러개
클래스를 선언하면 자동으로 this 키워드 생김
this. ; 주소값 > 메소드에 접근한 객체가 가지고 있는 필드의 주소
클래스는 추상적임 > 추상적인 개념을 가지고 필드에 접근하는 건 쉽지 않음
구체적인 개념으로 바꿔줘야 함. >> 객체화(instance)
instance variable : 객체(객체화를 통해 나온 변수), 구체적
(클래스 : InheritanceTest)
■ 상속(inheritance)
1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때
2. 여러 클래스 선언 시 필드가 겹치는 경우, 부모 클래스를 먼저 선언하고
공통 필드를 묶어서 자식 클래스에게 상속해준다.
■ 상속 문법
class A{ //부모 클래스
A 필드
}
class B extends A{ //자식 클래스
(A,) B 필드
}
A : 부모 클래스, 상위 클래스(문헌), 슈퍼 클래스(해외), 기반 클래스(논문/대학원)
B : 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스
■ extends > 키워드
자식클래스에서 없는 필드는 부모에서 찾을 수 있어야 한다
클래스 필드에 선언된 내용이 없는데 사용을 한다면 상속됨을 인지하기!
■ super() : 부모 생성자
자식 클래스 타입의 객체로 부모필드에 접근할 수 있다.
하지만 자식 생성자만 호출했기 때문에, 자식 필드만 메모리에 할당된다고 생각할 수 있다.
사실 자식 생성자에는 항상 부모생성자를 호출하기 때문에
자식 생성자 호출 시 부모와 자식 필드 모두 메모리에 할당된다.
이 때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다.
만약, super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다.
자식영역 안에서 부모를 super()로 대체해서 쓰면 됨
부모영역 안에서 부모를 쓰려면 this. 사용
(클래스: InheritanceTest2)
■ 다형성(polymorphism)
1.오버로딩
2.오버라이딩(overriding : 무시하다 > 부모를 무시하고 다시 만든다 > 재정의)
부모 필드에서 선언한 메소드를 자식 필드에서 수정하고자 할 때 재정의를 해야 한다.
이는 자식에서 부모 필드의 메소드와 동일한 이름으로 선언하는 것이다.
부모 필드가 메모리에 먼저 할당되고 a라는 메소드가 먼저 올라간다고 하며,
자식 필드가 메모리에 할당되면서 재정의한 a메소드가 새롭게 만들어지는 것이 아니라
기존에 할당된 a메소드 저장공간에 새롭게 재정의한 자식 필드의 소스코드 주소가 들어가게 된다.
따라서 자식 객체로 a메소드에 접근하면 자식 필드에서 재정의한 소스코드의 내용이 읽히게 된다.
자식에서 재정의된 거는 부모 필드 내용을 쓰지 않겠다, 새로 재정의한 필드 사용
부모필드 내용을 쓰고 싶으면, 부모를 객체화해서 쓰면 됨
■ 메소드 ; 저장공간
a 메소드의 저장공간, 사용을 하면 리턴값
메소드에 작성한 코드는 메모리 안에 텍스트 영역에 할당
텍스트 영역에는 코드에 고유한 주소값이 생김
메소드에는 주소값이 담김, 메소드를 사용할 때 그 주소를 참조하는 것임
return값이 있다면 주소값 대신 return값이 들어가는 것임
return이 없다면 주소값을 담을 수 있는 타입이 없으니 그걸 값으로 보면 안됨!
■ 오버라이딩
: 새롭게 재정의한 저장공간의 주소값을 받아옴
재정의를 쉽게 보면,
int data = 10;
data = 20;
syso(data);
>> 20출력
>> 메소드는 저장공간이다!
■ @ 어노테이션
PM
■ @override
부모의 코드를 그대로 사용하고자 할 때
슈퍼로 먼저 부모 코드 사용
자식에서 코드 추가
(클래스: InheritanceTask)
자식생성자에서는 부모의 기본생성자를 호출하는 것이 디폴트
초기화 생성자를 만들었으면 기본생성자를 직접 만들어주기!
자식 기본 생성자는 부모의 기본 생성자를 호출한다.
부모에 기본 생성자가 없으면 자식의 기본 생성자는 오류가 발생한다.
부모의 기본 생성자를 기본적으로 만들어 두기!!
----------------------------------------------------
■ Storage class(저장 기억 부류)
Stack | Data영역 | |
지역변수,매개변수 | 전역변수(파랑색),정적변수(static) | |
초기화 | 직접 | 자동 |
생명주기 (메모리에서 언제 해제되냐?, 언제까지 살아있냐) |
} | new, 프로그램 종료 시 |
char의 초기값 => ' ';
클래스에 선언된 전역변수들은 메모리 영역 중 데이터 영역에 할당됨.
필드는 메모리에 할당될 때 힙메모리에 할당될지 몰라도
해당 필드 안에 있는 각각의 요소는 알맞는 영역에 할당이 된 뒤 거기 주소를 필드가 갖고 있음.
(클래스: storageClass.VariableTest)
전역변수 : 생성자로 메모리에 할당함
정적변수(static) : 컴파일러가 static부터 메모리에 할당함, 생성자로 호출X, new에 영향X
모든 객체가 공유해야 할 때 static 사용
■ 전역변수
생성자를 통해 메모리에 할당되며, 객체가 각각 가지고 있는 변수
■ static변수(정적변수)
컴파일러를 통해 메모리에 1개 할당되며, 모든 객체가 공유하는 변수
ex.대한민국 도로교통법상 제한속도 80 -> 60으로 변경(모든 객체가 공유해야 하는 것들)
----------------------------------------------------------
day06
■ 클래스의 필드 사용
1.객체화
: momCar.color()
2.static일 경우 클래스명으로 바로 접근 가능
: Integer.parseInt()
-----------------------------------------------------------
■ 접근 권한 제어자(접근자)
default : 다른 패키지에서 접근 불가
public : 모든 곳에서 접근 가능, 해당 파일의 메인 클래스일 경우만 사용
protected : 다른 패키지에서 접근 불가, 자식은 가능
private : 다른 클래스에서 접근 불가(같은 패키지여도 불가), 메소드로 접근하자!
(클래스: Access1~3)
private >> 다른 곳에서 수정, 사용 접근하지 못하도록 막음.
>> 접근할 때 간접적인 메소드로 접근해라, 메소드(게터,세터)를 만들어라는 경고가 뜸!
>> 직접 접근 못하게 막음, jsp상위과정에서는 메소드로만 접근 가능
>> 나중에 jsp에서는 모든 필드에 게터세터를 만들고 메소드를 사용
>> jsp에서 객체화를 하는 태그에서는 기본생성자밖에 호출이 안됨, 초기화 생성자 호출X
>> 초기화를 안하더라도 기본 생성자를 만들어놔야 함, 기본생성자가 없으면 객체화X
접근하는 방법
1. 생성자
2. 메소드
게터세터 단축키 : alt+shift+s > r
------------------------------------------------------------
★Casting★
up casting : 자식 값을 부모 타입으로 형변환
down casting : up casting된 객체를 자식 타입으로 형변환
※ 부모 값을 자식 타입으로 형변환 시 오류
■ 작은 네모(A, 부모) / 큰 네모(B, 자식)
메모리에 올릴려면 다 채워야 함
남는 공간이 있으면 메모리에 안 올라감
■ B -> A : 업캐스팅, 자식타입이 부모타입으로 바뀜(+알파는 숨어있음)
■ A -> B : 오류
■ 업캐스팅된 B -> B : 다운캐스팅
■ 캐스팅 문법
A a = new B(); // 업 캐스팅, 자식이 부모타입으로 바뀜
* 모든 자식은 부모타입이다
B b = a; // 오류
B b = (B) a; //강제로 B타입으로 변환, 다운 캐스팅
B b = new A(); // 오류(타입이 다름), 메모리상으로 오류(빈 공간을 채울 수 없음)
■ 구현이 되지 않은 필드는 메모리에 올릴 수 없다
a에다가 b를 넣으면 ? > 메모리에 할당됨. > 업캐스팅
b에다가 a를 넣으면 ? > 메모리에 할당 안됨 > 오류
(클래스: CastingTest)
■ Casting을 사용하는 이유
모든 자식 값을 전달받기 위해서는 동일한 타입의 저장공간으로 받아야 한다.
하지만 자식끼리는 서로 타입이 다르기 때문에 한 번에 전달받을 수가 없다.
이 때 up casting을 사용하면, 모든 자식이 부모 타입이므로 하나의 저장공간에 모든 자식을 받을 수 있게 된다.
만약 up casting으로 자식 값을 전달받았다면, 자식에서 새롭게 구현한 기능들은
사용할 수 없기 때문에 down casting을 통해서 복구하고 사용한다.
■ 객체 간 타입 비교(instanceof)
a instanceof A : 조건식, 참 또는 거짓 중 하나가 나오는 식
- a가 A 타입이면 true
- a가 A 타입이 아니면 false
'2022 > java 2' 카테고리의 다른 글
day10[추상클래스,인터페이스,내부/익명클래스,람다식] (0) | 2022.08.10 |
---|---|
day09[day01~09 종합실습] (0) | 2022.08.10 |
day07[클래스 실습] (0) | 2022.08.08 |
day06[클래스, 객체화, 생성자] (0) | 2022.08.08 |
day05[2차원배열,메소드] (0) | 2022.08.08 |