필드를 만들면 초기화를 안하고 선언만 해놓고 객체를 만들면
해당 타입에 기본값만 들어가게된다.
local 변수는 만들어놓고 초기화를 안하면 쓰레기 값이 들어있다.
-> 책에 있는 내용 : 필드 선언은 기초 타입 변수 선언처럼 선언할 때 명시적으로 초기화할 수 있다.
그러나 지역변수와는 다르게 명시적으로 초기화하지 않으면 표 4-1 과 같이 기본값으로 초기화 된다.
자바는 함수가 없다. 메서드만 유일
C언어 / 파이썬에만 함수 있다.
메서드 처음부터 명확하게 정의할 것
new 연산자 자바에서 래퍼런스 타입의 객체를 사용할 때 new 연산자 사용
new 연산자들은 메모리 heap 메모리 객체 만든다.
heap reference 값을 리턴 해준다.
stack 영역에 있는 car는 local 변수로 들어감
클래스는 자바의 데이터타입에서 참조 타입 중 하나이다. new 연산자를 사용해 객체를 생성하고
반환된 주소를 변수에 대입하면, 변수가 생성된 객체를 참조한다.
Car 클래스를 소문자로 바꾸게 되면 혼란스러움
대소문자 철저히 지켜라
동일한 객체의 레퍼런스 값을 가지고 있다.
car이랑 this 레퍼런스의 값이 같은 걸 확인
this는 객체가 만들어져야만 확정이 된다.
객체마다 레퍼런스 값이 다르다.
this.color 같은 개념
new 연산자로 객체를 만들고자하는 해당 클래스의 생성자를 호출
생성자는 new 연산자와 함께 사용하며 객체를 생성할 때 호출한다.
왜 오류가 날까....?!
이클립스는 저장하는 순간 컴파일
이클립스가 판단
생성자가 하나도 없네? 자바 컴파일러 생성자가 없으면 못만든다.
public Car () { }
이클립스가 기본 생성자를 만들고 싹 컴파일한다.
사용자가 생성자가 아무것도 안만들면 new로 기본 생성자를 삽입시키고 컴파일
그래서 처음껀되었는데 사용자가 어떤 형태로든 만들어내면 컴파일러가 개입을 안함
기본 생성자가 없으므로 에러가난다.
>>>>>>>>>> 해결 하려면
기본 생성자를 사용자가 직접 만들어 줘야한다.
Car.java에서 만들고 CarMain.java에서는 빨간 줄이 사라진다.
같은 생성자가 2개 있는게 Overload
이름이 똑같고 argument 가 다를 때 (ex. 개수가 다를경우, 이름이 같아도 타입이 다를경우)
이름은 같지만 시그니처는 다른 메소드를 중복으로 선언 할 수 있는 방법을 메소드 오버로딩
파란 부분이 메서드의 Signiture 시그니처
만들어진다.
이클립스가 줄일 수 있는 방법
생성자
int 강제 형변환
int로 바꿨는데 정상적으로 돌아간다.
정사각형 int 로 바꾸기 But... 빨간 줄
double int 달라도 상관 없음 더블 타입 하나 더블 타입 다른 하나
메서드 최종 결론
method Overload는 method signiture 중에서 return type을 제외한 나머지 부분으로 판단
메서드 오버로딩
: 메서드 이름은 같지만, 메서드 시그니처가 다른 메서드를 정의하는 것
자바는 반환타입으로 메서드를 구분하지 않기 때문에 반환 타입이 다르다고 메서드를 오버로딩할 수는 없다.
static
class code를 끌고 올라감
메인 메서드를 찾는다. 메인에서 static 영역에 올라가 있음. 걔를 실행.
어딘가에 main. 이걸 누가해 ? 메인 메서드가 staitc인 이유
인스턴스를 만들기 이전에 java virture machine에서 사용
static이 필요한 이유
시스템 클래스의 out field printStream 객체 refernce
class이름으로 접근 가능하다.
- 자바에서 출력에서 객체 레퍼런스를 넣어준다.
연속적으로 출력 printStream
static 영역에 올라간 것 공통적으로 하나만 있는 것 .
인스턴스 필드 메서드
static
정확한 개념상 인스턴스 필드 메서드
지금하는건 static 필드
두개의 stiatic 필드 만들기
인스턴스를 만들기 이전에 사용가능하다.
Static Block
static 블럭 안에 인스턴스 메서드 멤버 들어오는 것을 허용하지 않는다.
final의 역할
: 값이 할당되는 순간에 잠겨서 값을 바꾸려고 해도 바꾸지 못함.
오류가 뜰 수 밖에 없는 이유 수정 불가능
변수가 아니라 상수 정해져 있는 값
상수 constant
상수는 대문자로 쓴다.
암묵적인 rule....
static의 또다른 용도 상수를 쓴다.
자바 import
특정 클래스 내 입장에서 다른 클래스 쓸 때 같은 클래스를 사용하면 전혀 문제가 없음
다른 패키지의 클래스를 쓸려고하면 문제가 생김
이렇게 쓰면 너무 기니깐 import로 해주자!
나와 다른 패키지의 클래스를 쓰려면 무조건 import
이클립스가 알아서 찾아서 import를 해준다.
Public
public은 누구든지 접근이 가능하다.
접근 제한자(Access Modifier)
public - class, field, constructor(생성자), method 에도 붙일 수 있다.
public이니깐 main method에 그래야 실행이됨누구나 아무 제한 없이 접근이 가능한게 public
protected - 나를 생성한 생성자는 접근이 가능하다. 상속과 비슷
- 자기 자식과의 접근이 가능하다.
- field, constructor, method
private - 사적인 것 ..............
- 접근 못하고 자식도 접근 못함. 해당 내에서만 접근이 가능하다.
- field, constructor, method
default - field, constructor, method
아예 안쓰는게 default
같은 패키지 접근 가능
매개변수 X 본체에서 실행할 내용도 X
// 필드에서 값을 getter 접근자 setter 설정자
필드에서 값을 뽑아오는 것 setter 필드에서 값을 설정하는 것
사용하는 이유 : 1. 정보 은닉 2. 세팅, 오류값? validation check 유효한 값인지 체크 이상한 값 차단
private를 쓰면 main method에서 사용하지 못함.
private 는 내부에서만 동작 상속도 불가능
APP 데이터 연결 객체를 이용해서 넣어주고 빼겠 끔 구성
데이터 전달용으로 쓴다.
DTO (Data Transfer Object)
VO(Value Object)
java 입장에서는 Bean = DTO = VO 같은말이다.
getter & setter
getter :
setter :
상속 inherit
: 부모 자식 관계
부모님 물건이지만 내가 쓰겠다...!
생성자를 가지고 있는데
convertible은 부모의 생성자 호출 안했는데?
컴파일러가 컴파일을 받으면서 무조건 super의 기본 생성자를 호출한다.
생성자가 호출 X
상속을 안받았는데 super가 따라다님
자바에서 정의하는 오브젝트 클래스를 상속받게 되어있다.
다중상속 -> c++ 에서는 허용 -> 문제가 많음.. 필드나 메소드가 여러군데에서 상속 -> 복잡.. 프로그램난해
굳이 다중상속이 필요없다.. 해서 자바는 다중상속 X
private로 설정하면, 부모지만 자식한테 알려줄 수 없다.
inherit
Person / StudentMain / Student
자식 객체의 생성자
부모의 생성자를 제일 처음 호출한다. 반드시 ☆☆
부모의 생성자가 생기고
자식객체의 생성자가 끝나면 자식 객체가 생긴다.
10단계 타고 올라가서 밑에 만들고 굉장히 많은 객체를 만든다.
상속관계에서 부모의 생성자 호출
내부적으로 부모객체를 만든다.
부모의 메소드 내용을 재정의 = method Override 내용을 바꿔서 쓴다.
method overload랑 헷갈리지 말기
부모의 메서드 내용을 재정의 한다. method Override 라고 한다.
Calculator 부모
Computer 자식
ComputerMain 메인
radius에 10을 넣어서 출력한다.
값 비교해보기..
메서드 재정의 주의할 점
오타가 나거나 잘못 작성하면 둘다 부모 메서드를 실행한다.
메서드 오버로드랑 달리 메서드 오버라이드는
시그니쳐 전체부분이 100% 동일해야한다.
에러가 안나는데 실행할 때 부모 메서드로 실행한다.
에러가 안나서 틀리는 걸 방지하기 위해 @Override를 적어준다.
오버라이드 하고 싶으면 source -> override
public final class String // 상속 불가능
<final 클래스>
더 이상 상속할 수 없는 클래스
ex) String
-----------------------------------------------------------------------------------------------------
<final 메소드>
자식 클래스에서 오버라이드 불가
못보는데 왜 자식 객체가 실행될까?
오버라이드한 메서드를 실행할 때에는 가지고 있는 실제 객체가 무엇인가?
child가 실행이 된다.
기본적으로 child객체지만, 자식은 못본다.
그런데 예외 상황이 있다.
그럴 경우에는 실제 객체는 무엇인가? 부모 객체...
그 객체의 오버라이드한 객체
메서드가 그 객체의 오버라이드한 자식들 객체 실행
Polymorphism 다형성을 구현하기 위해서
부모 타입의 reference 변수보다
자기 자식 객체를 못본다.
메서드 쓰는지 모른다.
부모 타입의 변수를 쓸 때는 자식 객체를 못보게 된다.
'IT > JAVA' 카테고리의 다른 글
[15일차] JAVA Programmers 개념정리 (0) | 2022.07.08 |
---|---|
[15일차] JAVA (0) | 2022.07.08 |
JAVA Programmers 개념 정리 (0) | 2022.07.06 |
[13일차] JAVA 연산자 / 제어문 for if while do while (0) | 2022.07.06 |
[12일차] JAVA 역사/ 설치/ println (0) | 2022.07.05 |
댓글