본문 바로가기
IT/JAVA

[14일차] JAVA 객체지향

by GWLEE 2022. 7. 7.

필드를 만들면 초기화를 안하고 선언만 해놓고 객체를 만들면

해당 타입에 기본값만 들어가게된다.

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

댓글