JAVA

[JAVA] 상속, 오버라이딩

shb 2021. 10. 14. 14:17

기본구조
         프로젝트
                    패키지(소문자)
                                클래스(대문자)
                                             메소드(이름())
                                                            소스코드
변수와 상수 
출력메소드 : 개발자를 위한 도구
입력메소드 : Scanner
연산자
         우선순위
                  최우선
                  단항
                  산술
                  쉬프트
                  관계
                  논리
                  삼항
                  대입
결합성
하나의 문장에 같은 우선순위 연산자가 나타나면 알맞는 방향으로 결합되어 연산되는 성질
제어문
조건문
if
switch
반복문
for : 반복횟수를 알 때
while : 반복횟수를 모를 때
do~while : 한 번은 무조건 실행되어야 할 때
배열
저장공간의 나열
1. 이름을 하나만 붙여도 접근 가능
2. 규칙성이 없는 값에 규칙성을 부여하기 위해서
지우개 우산 마우스 키보드


메소드
1. 이름() 단, 키워드() 메소드 아니다. 
2. 저장공간 - 메모리에 저장공간이 할당, 사용한 부분이 통채로 return값


클래스(반) - 공통요소를 묶어서
1. 주어이다. (앞글자를 대문자로)
Monkey.eat("바나나");
원숭이가 먹는다 바나나를

2. 타입이다. 
클래스타입 객체명 = new 생성자();
new : 명령어 뒤에 있는걸 Heap이라는 메모리 영역에 할당시켜라
Heap : 동적 메모리


클래스를 왜 만들지? 한번만 선언하기 위해, 반복작업을 줄이기 위해


왜 메모리에 할당? 
생성자 : 메모리에 할당하는 역할 -> new가 어떤 영역에 할당할지 알려줌
생성자가 할당된 필드값을 다시 가져옴  
new 생성자(); -> 필드에 할당한 주소값, 리턴값 , 할당된 필드의 주소
생성자는 메소드라고 부르면 안됨
메소드는 return을 쓸 수 있어야 함, but 생성자는 return 기능을 쓸 수 없음
그 외에는 메소드와 기능이 같음, 이미 리턴할 값이 있기 때문에
본인이 할당할 필드의 주소값을 가져와야 함. 


추상적인 개념 : 클래스(도형) / 추상적인 것을 구체적으로 : 객체화(동그라미)

1. 객체명.
2. new 생성자().
-> 둘 다 사용 가능, 마침표 앞이 값

 

main ctrl space enter 
----------------------------------------------------------------------------------------
변수의 종류
지역변수(local variable) : 클래스 중괄호영역은 포함되지 않는다. 
매개변수(parameter) : 메소드의 소괄호에서 선언된다. 
전역변수(global varaible) : 클래스 중괄호 영역에서 선언된 변수
정적변수(static variable, class variable) : 객체 간 공유, 편의성

저장기억부류(Storage class)

   메모리 |stack                                  Data영역|
     변수 |지역                                   전역, 정적|

  초기화  직접                                       자동
생명주기 }닫는 영역을 만나면           new, 프로그램 종료
              메모리에서 해제
----------------------------------------------------------------------------------

상속(inheritance)
1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때
2. 여러 클래스 선언 시 필드가 겹치는 경우, 부모 클래스를 먼저 선언하고, 

공통 필드를 묶어서 자식 클래스들에게 상속해준다. 

상속 문법

class A{
A필드
}

class B extends A{
A, B필드
}
// 메모리 상으로 더 큰게 자식, 받은게 더 많아서 +a 

A : 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스
B : 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스


자식 생성자를 호출했는데 어떻게 부모 생성자의 필드에 접근하는가?

자식생성자를 호출하면 자동으로 부모 생성자를 호출하는가?

클래스 이름 뒤에 소괄호 : 생성자

super() : 부모 생성자
자식 클래스 타입의 객체로 부모 필드에 접근할 수 있다. 
하지만 자식 생성자만 호출하기 때문에, 자식 필드만 메모리에 할당된다고 생각할 수 있다.
사실 자식 생성자에는 항상 부모 생성자를 호출하기 때문에

자식 생성자 호출 시 부모와 자식 필드 모두 메모리에 할당된다. 
이때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다. 
만약, super()를 작성하지 않아도 컴파일러가 자동으로 작성해준다. 

다형성 overriding(무시하다) - 부모 거를 무시하고 자식꺼를 쓴다. 
int data = 10; 부모
data = 20; 자식
sysout(data); = 20

String data = "안";
data a = data a +"녕";
              사용

다형성
1. 오버로딩 

2. 오버라이딩(재정의)
부모 필드에서 선언한 메소드를 자식 필드에서 수정하고자 할 때 재정의를 해야 한다. 
이는 자식에서 부모 필드의 메소드와 동일한 이름으로 선언하는 것이다. 
부모 필드가 메모리에 먼저 할당되고 a라는 메소드가 먼저 올라간다고 하면, 
자식 필드가 메모리에 할당되면서 재정의한 a메소드가 새롭게 만들어지는 것이 아닌
기존에 할당된 a메소드 저장공간에 새롭게 재정의한 소스코드의 주소가 들어가게 된다
따라서 자식 객체로 a메소드에 접근하면 자식 필드에서 재정의한 소스코드의 내용이 읽히게 된다.