1. JAVA/3). 자바_개념

자바_개념_Day_17

구이제이 2024. 1. 23. 18:01

목차



●책

ㅡㅡㅡ

1.클래스 - 필드,멤버변수의 생명범위,저장위치,초기화

파일명 : day17/inheritance.exam1/



public class AnimalMainExam {

 

public static void main(String[] args) {

//#1. 객체 생성

Animal ani = new Animal();

Cat cat = new Cat();

Dog dog = new Dog();

Bird bird = new Bird();

 

//#2. 객체를 이용

ani.name = "동물들";

ani.age = 5;

ani.cry();

System.out.println("----------------------");

//#-----------------------

 

cat.name = "야옹이";

cat.age = 3;

cat.cry();

System.out.println("----------------------");

//#-----------------------

 

dog.name = "멍멍이";

dog.age = 5;

dog.cry();

System.out.println("----------------------");

//#-----------------------

 

bird.name = "짹짹이";

bird.age = 4;

bird.cry();

System.out.println("----------------------");

//#-----------------------

 

 

}

}






public class Animal {

 

//#1. 필드 생성 - 속성,

String name; //동물의 이름

int age; //동물의 나이

 

//#2. 생성자 - 객체 초기화

public Animal() {}//기본 생성자

 

//1)객체 생성하면서 나이 이름 줄수있고

//2)처음부터 나이 이름 적용 하는 방법

 

//#3. 메소드 - 기능, 동작

public void cry() {

System.out.println(name + "이가 소리를 낸다.");

System.out.println(name + "(이)는 " + age + "살이다.");

System.out.println();

}

}

 

public class Bird extends Animal {

 

//# 새들만의 기능

public void fly() {

System.out.println("새가 날고 있다.");

}

 

}

 

public class Cat extends Animal {

 

public void jump() {

System.out.println("고양이가 높이 뛴다.");

}

}

 

 

public class Dog extends Animal {

//# 강아지만이 가진 기능

public void run() {

System.out.println("강아지가 달리고 있다.");

}

 

 

}







1.상속





*상속

자식은 부모꺼를 가져다 쓴다.

부모는 자식꺼를 못가져가

 

*추상화

공통점을 뽑아내는 것이 ‘추상화’

 

*뽑아 내야 할때,

공통된것 - 

반복되는것 - 

 

*private

계산식 노출시키지 않음



*상속(exteds)

상속 그림에 대한 이해

부모 < 자식 (화살표가 부모에게 향하게 된다.)

 

*’힙’에 올릴수 있는 조건

비어있고 미완성된것 못올린다.

 

부모는 내게 물려준 것 외에 손댈수 없다.

 

*

부모꺼는 내꺼

 

Object < A < B < C < D (extends)

Object <A < E < F <G (extends)

 

*object는 모든것을 끌어다가 ???★★★

O obj = new A(); >>> A에다가 Object를 담아서 obj에 넣어라

O obj2 = new B(); >>> B에다가 Object를 담아서 obj2에 넣어라



 

*자식은 부모꺼를 힙에다가 올릴수 있다. 부모가 될수가 있다.(용어로 ‘다형성’’)

A a = new A(); = 가능하다

 

A ab = new B(); = 가능하다

A ac = new C(); = 가능하다

A ad = new D(); = 가능하다



B ba = new A():  = 불가능

C ca = new E(); - 조상이 다르다.부모는 같지만,

 

 

자식은 부모한테 담겨요, 자식은 부모가 될 수 있다.

형변환(짝은 타입이 큰타임으로 바뀌는 것) - 업캐스팅



자식은 부모꺼에 담을수 있따.

부모는 자식에 못담아 . 부모가 자식보다 가진게 적기 떄문에.

하나밖에 상속못받음



상속 - 

추상클래스 -  

인터페이스 -

 

무조건 상속을 쓰는 것은 아니다. 상황에 따라 알맞은 것을 써야한다.



*

자식은 부모가 될수 있다.

부모는 자식 못 된다.(부모가 가진게 더 적기때문에 - 큰것이 작은거를 담는다)




동물패키지 설명

 

*

객체생성없이 바로 쓸수 있는 것이 static

main 메소드도 static이라서 바로 쓸수있다.



*

부모꺼 초기화시키고

그다음에 자기꺼 초기화시킨다.






dog라는 참조타입의 변수를 스택에(최종완성 주소를) 넣는다.

부모꺼 힙에다가 준비시킨다.

run이라는 메소드의 주소를 힙영역

 

Bird

1.부모꺼 먼저 실행

name,age,cry라는 것을 (항상같이쓴다)

부모꺼 다끝나면, 자기꺼 fly() 데이터영역에 준비시킨다.

다 만들어지면, 힙영역의 name,age,cry,fly 담겨져있는 전체주소를 bir에 담는다.



1)자식은 부모꺼를 먼저 초기화하고 자기의 것을 초기화한다.

2)부모자식 합쳐서 자기것이라한다.

 

*

메모리읽혀지자마자 바로 올라온다. 그래서 어디서든지 끌어서 쓸 수있다.

 

인스턴스 메소드 = 

스타틱 메소드 = 클래스뱃속에 관리하는 스타틱영역에 만들어진다.

스타틱 변수를 사용할때, 사용해줘야 한다.

스타틱메소드안에서 스타틱변수로 돌아가야한다.



이름같은 메소드 쓰면 겹친다.

메소드가 겹쳐지지기 떄문에 오버라이딩이 생긴다.



*부모꺼 cry를 다르게 쓰고 싶을때,

overriding(부모꺼를 자식에게 맞춰서 고쳐쓴다. ‘재정의’) 고쳐쓴다.

overroding(이름이 같고, 매개타입, 매개변수갯수가 다르면, 같은이름을 써도 된다.)

컴퓨터는 이름,매개변수,매개변수갯수를 보고 찾아간다. 









ㅡㅡ

1.상속 

2.오버라이딩

super의 오류



2.오버라이딩

파일명 : day17/inheritance.exam2/



public class AnimalMainExam2 {

 

public static void main(String[] args) {

 

/*

//변경전

Animal ani = new Animal();

Dog dog = new Dog("복실이");

Cat cat = new Cat("야옹이", 3 , "생선");

Bird bird = new Bird();

 

ani.cry();

dog.cry();

cat.cry();

bird.cry();

 

System.out.println("dog age : " + dog.age);

*/

 

 

 

//변경후

//자식은 부모가 될 수 있다.- 라는 것을 이용

//다형성

Animal[] animal = { //자식타입은 부모타입에 담을 수 있다.

//배열로 만들기 보다는, 메모리 어딘가에 배열을 만들고 주소를 담는다.

new Animal(),

new Dog("복실이"),

new Cat("야옹이", 3 , "생선"),

new Bird()

};

 

for(int i = 0; i <animal.length; i++) {

animal[i].cry();

}

 

 

 

 

}

}



public class Animal {

 

//#1. 필드 생성 - 속성,

String name; //동물의 이름

int age = 2;; //동물의 나이

 

//#2. 생성자 - 객체 초기화

public Animal() {}//기본 생성자

 

public Animal(String name) {

this.name = name;

 

}

 

//1)객체 생성하면서 나이 이름 줄수있고

//2)처음부터 나이 이름 적용 하는 방법

 

//#3. 메소드 - 기능, 동작

public void cry() {

System.out.println(name + "이가 소리를 낸다.");

System.out.println(name + "(이)는 " + age + "살이다.");

System.out.println();

}

 

 

}




public class Bird extends Animal {

 

//# 새들만의 기능

public void fly() {

System.out.println("새가 날고 있다.");

}

 

 

@Override //재정의 - 부모것을 고쳐 쓴다

public void cry() {

super.cry();

 

System.out.println("즐거운 시간~~");

System.out.println();

fly();

}

}



public class Cat extends Animal {

//#1. 필드

String eat;

 

 

//#2. 생성자

public Cat(String name, int age, String eat) {

super();  //부모의 기본생성자를 호출한다. ex) Animal에 생성자.

this.name = name;

this.age = age;

this.eat = eat;

}

 

//#3. 메소드 - 기능, 동작

public void jump() {

System.out.println(name + "가 높이 뛴다.");

}

 

@Override//재정의, 부모것을 자식이 고쳐 쓴다.(@Override 생략해도 된다. 그러나 하지말라, 컴파일러가 @Override가 알기 때문에, 오타나면, 컴파일러가 체킹해주는 것도 있다.)

public void cry() {

System.out.println("야옹");

System.out.println();

jump();

}

 

//오버라이딩 되기전, 부모의 필드를 쓰고 싶다. super.필드 명

//super라는 말이 부모를 지칭한다.

 

 

 

}



public class Dog extends Animal {

int age = 3;

 

/* //오류난다. Animal에 부모 생성자가 추가되지 않아서 이다.

public Dog(String name) {

super(name);

}

*/

 

public Dog(String name) {

super(name);

}

 

 

public void run() {

System.out.println(name + "가 달린다.");

System.out.println(name + "이는" + age + "살이다"); //부모 필드르 사용하고 싶다면, super.age

//super.age => 부모의 age

}

 

@Override //재정의 부모 것을 다시 고쳐 쓴다

public void cry() {

System.out.println("멍멍~~");

run();

}

}









●super의 오류

 

-부모의 클래스에 생성자가 없기 때문에, 

public Animal (String name) {

this.name = name;

}

 




부모의 int age

자식의 int age

밑에 메소드에는 오버라이딩 했다.

그러나 변수에는 붙이지 않았다.



공통영역

데이터영역 = 클래스, ‘생성자’와 ‘스타틱’붙은게 클래스가 관리가.

스타틱 붙으면 메모리에 싹 붙인다.



스택 = 메소드가 실행되는 것(눈에 안보이는 프레임들이 생긴다)

그래서 메인이 가장 밑바닥에 존재(가장먼저 불렀다.) LIFO

지역변수




Overriding

데이터영역에 부모꺼 위에 자식꺼를 위에 올려놓는거다.

부모의 cry메소드가 사라지는것은 아니다. 덮어지는 개념이다.



부모꺼 볼려면

dog.super.메소드이름 또는 변수이름






클래스 : 설계도, 틀

 

클래스의 멤버 : 필드(=멤버변수), 메소드(=멤버메소드)

클래스의 구성요소 : 필드 , 생성자, 메소드, 이너클래스

 

1. 필드(field)

   - 특성(=속성)

   - 메소드의 내부(지역변수)를 제외하고 클래스 내부의 어디에서든 선언할 수 있음

     (cf - 지역변수는 매개변수나 메소드 내부에서 선언된 변수,for문, while문, if문

                    등 블록내부에서도 지역 변수를 선언할 수 있음)

   - 필드 선언시 초기화하지 않아도 기본값으로 자동 초기화

      (비교 -  지역변수는 기본값이 없기 때문에 반드시 초기화 해야 함)

   - 필드는 클래스 전체에서 사용할 수 있음

     (cf - 지역변수는 선언된 후부터 선언된 블록({}) 내부에서만 사용할 수 있음

      지역변수는 선언된 블록내에서만 사용하며)

   - 필드는 모든 접근 지정자뿐만 아니라 static, final로 지정할 수 있음

     (cf-지역변수는 final만 지정할 수 있음)

 

2. this : 자기자신 객체 참조변수,  자신이 참고하는 객체의 주소,

    명확하게 멤버라는 것을 제시하고자 할때

 

  생성자 : new 연산자를 이용해서 클래스로부터 객체를 생성할 때 호출되어

           객체의 초기화를 담당

 

  객체의 초기화 : 필드를 초기화하거나(사용할 수 있게 준비시킨다) 메소드를 

               호출해서 객체를 사용할 준비를 하는 것

   생성자를 사용하지 않고는 클래스로부터 객체를 만들 수 없음

 

      기본생성자 :   [접근제한자] 클래스(){

            객체를 초기화할 문장(코드)

                    }

     생성자를 선언 

       [접근제한자] 클래스(매개변수,...){ 

                            // 객체를 초기화할 코드(문장)

        }



3. 오버로딩(overloading) : 매개변수의 개수와 매개변수의 타입이 다른 것

       - 생성자 오버로딩 : 생성자 이름이 같고, 매개변수의 개수나 매개변수의 타입이 다른 것

       - 메소드 오버로딩 : 메소드 이름이 같고, 매개변수의 개수나 매개변수의 타입이 다른 것

                          리턴타입은 의미가 없음

      메소드 이름은 같되 매개변수의 타입, 개수, 순서가 다른 메소들 여러개 선언하는 것

      사용목적 : 다양한 매개값을 처리하기 위해서      

    

 

4. this() : 자신의 다른 생성자를 호출

   반드시 첫 줄에 사용



5. 메소드 선언

   [접근제한자] 리턴타입 메소드명(매개변수,...){     // 선언부(메소드 시그너처(signature))

      메소드를 실행할 코드(문장)              // 구현부, 메소드 실행 블록,  body

   }

   

   - 리턴 타입 : 메소드가 리턴하는 결과의 타입을 표시

   - 메소드 이름 : 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어줌

   - 매개 변수 선언 : 메소드를 실행할 때 필요한 데이터를 받기 위한 변수를 선언

   - 메소드 실행 블록 : 실행할 코드 작성

 

==========================

6. static 제어자

   1) 정적(static) 멤버 : 앞에 static이 붙은 멤버

                  객체 생성없이 '클래스명.멤버명'으로 바로 사용

         . 클래스 변수(정적변수, static 변수) : 클래스 내부에 생성, 객체간 공유 변수

         . 정적(static) 메서드 내부에서는 정적(static) 멤버만 사용 가능하며, 

                 클래스 내부에서 자신의 객체를 가리키는 this키워드 사용할 수 없음.

 

   2) 인스턴스 멤버 & 정적 멤버

       .인스턴스 멤버 : 객체 생성과 함께 만들어진다.  '참조변수명.인스턴스 멤버명'

                        멤버의 저장 공간이 객체 내부 즉 힙영역에 생성(객체에 만들어진다)

       .정적(static) 멤버 : 저정 공간이 클래스 내부 즉 class 영역(정적영역, 메서드 영역, 데이터영역)에 생성

 

   3) 정적 초기화 블록  

      . 인스턴스 필드의 초기화는 객체를 생성하는 시점에 이루어진다. 

      즉 객체가 생성자에 의해 초기화 되므로 생성자 내에서 

               인스턴스 필드를 초기화 해준다. 그러나 정적필드는 객체 생성 이전에 

   사용할 수 있어야 하므로 생성자가 호출되지 않은 상태에서도 초기화 할 수 있어야 함

               (즉 생성자에서는 정적 필드를 초기화 할 수 없음)

               정적 필드는 정적 초기화 블록(static { } )에서 초기화 해 주어야 함

      . 정적초기화 블록은 클래스가 메모리에 로딩될 때 가장 먼저 실행되므로 

    정적 필드의 초기화 코드를 넣어  주면 클래스가 로딩되는 시점에 바로 초기화

 

  4) main()메서드 

     자바 가상 머신(jvm)은 프로그램을 실행할 때 '실행 클래스명.main()'을 실행하므로 

      가장 먼저 실행되는 메서드인 main()메서드를 정적 메서드로 구성 

=====================================================================

7. 변수 유형에 따른 용도

   1) 지역변수(=local variable)  메소드 등의 내부에 선언

         스택영역에 위치(메소드를 호출하는 시점에 스택영역에 올라감)

         메소드의 실행이 끝나면 메모리에서 소멸

         메소드가 호출 될때 실행되고 메소드 실행이 끝나면 소멸

 

   2) 인스턴스 변수  : 클래스에서 필드로 선언되어 있으며,

         객체(인스턴스) 내부에 생성되며, heap 영역에 위치

 

   3) static변수(=클래스 변수, 정적변수) : static 예약어를 사용하여 클래스 내부에 선언

         클래스 내부에 위치

         객체들이 공유하는 변수

         메소드 영역(=데이터영역,=클래스영역)에 위치하며 프로그램이 끝나고 

                                           메모리를 해제할 때 소멸됨

====================================================================

8. 싱글톤(singleton) 패턴 

   - 애플리케이션 전체에서 단 한 개의 객체만 생성

   - 핵심 : 생성자를 private 접근 제한자로 제한해서 외부에서 

      new 연사자로 생성자를 호출할 수 없도록 막는 것

   - 외부에서 맘대로 객체를 생성하는 것이 불가능

   - 정적 메소드를 이용해서 외부에서 간접적으로 객체를 사용 

 

===========================================================================




ex02

 

1) 몸무게 변화 체크하기(WeightChange, WeightCangeMain) - 클래스

2) 이름, 키, 몸무게를 제시하고("홍길동", 170.8, 70.3) -> 생성자로 초기화

3) 이름, 키, 몸무게 필드는 모두  private로 처리 -> 필드

4) 몸무게의 변화를 입력 받아서(증가/감소)

-변화된 몸무게 입력 받기 - 메소드의 매개값으로 전달

-메소드 하나 만들어서 증가와 감소를 계산(1번방법)증감값을 넘겨 받기 2kg, -2kg, 0 )

2번방법)7.57

-입력은 메인, 처리는 다른 클래스

-WeightInfo(double weight) 

-showPrintInfo()

-계산하는 메소드 - gainWeight(double weight) - 증감

      reduceWeight(double weight) - 감소 

 

5) 메인 메소드 : 몸무게 변화를 입력해주세요

  변화된 몸무게 >>

  weightInfo(변화된 몸무게 넘겨주기)메소드 호출

 

    

    < 출력 형태 >

   5) 몸무게가  증가했습니다. 현재 ~~입니다.

    6) 몸무게가 감소했습니다. 현재 ~~입니다.





'1. JAVA > 3). 자바_개념' 카테고리의 다른 글

자바_개념_Day_19  (2) 2024.01.25
자바_개념_Day_18  (1) 2024.01.24
자바_개념_Day_16  (0) 2024.01.22
자바_개념_Day_15  (0) 2024.01.19
자바_개념_Day_14  (0) 2024.01.18