카테고리 없음

2024. 7. 3. (수) 슈퍼코딩 부트캠프 Day 27 / 주특기 2주차

태영9922 2024. 7. 3. 15:13

 

1. Java static이란?

- 모든 인스턴스가 공유하는 변수

static int studentID;
 

2. Java static 변수/ 메소드

- static 변수 = 정적변수= 클래스변수, 프로그램 실행 시 정적 생성. 인스턴스 생성 전에 정의 되어 있음.

- 멤버 변수와 다름. 멤버 변수는 인스턴스에 속해 있는 변수.

1) static 변수

class Student{
static int serialNum=1;
}
...
class Main{
int num = Student.serialNum; //인스턴스 생성 안해도 static 변수 사용 가능
} 
 
public class StaticTest {
    public static void main(String[] args) {
        //static 변수 접근
        int num = Student.serialNum; // 1
        String city = Student.city; // Seoul
        System.out.println(num + " " + city); // 1 Seoul 
    }
}
 
public class StaticTest {
    public static void main(String[] args) {
        Student.serialNum = 10; //static 변수 값 수정, 초기값은 1

        Student student1 = new Student("Alice", "Female");

        student1.printMyInfo();
        /*
        [Student] schoolName : 3, classYear : 1, classRoomNumber : 3, studentNumber : -1, studentID : 10, name : Alice, gender : Female
         */
    }
}
 

2) static 메소드

 private String name;
 ...
 public static int getSerialNum() {
        return serialNum;
    }

    public static void setSerialNum(int num) {
        serialNum = num; //this는 인스턴스 변수만 사용 가능. serialNum은 클래스변수이기 때문에 그냥 사용
        this.name = 블라블라 //static 메소드에서는 인스턴스 변수에 접근 불가!!! 
                           // 왜냐? 인스턴스가 만들어지기 전에는 인스턴스 변수가 생성되지 않기 때문에
    }
 

 

3. Java 변수 유효범위

1) 클래스변수(static 변수) : 클래스가 만들어 질때 생기는 변수. 프로그램이 처음 시작할때 생성되어 프로그램이 끝나고 메모리를 해제할 때 소멸.

2) 멤버변수(인스턴스 변수) : 인스턴스 만들때 생기는 변수. 인스턴스가 생성될때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨.

3) 로컬 변수(지역 변수) : 함수 내부에 선언되고 함수 내부에서만 사용. 함수가 끝나면 소멸.


1. 객체의 상속

1) 상속의 특징

- 자식 특성은 부모특성을 물려받는다.

- 자식 메소드는 부모의 메소드를 물려받는다.

2) 상속의 장점

- 새로운 데이터 및 기능을 추가할 수 있다.

- 코드 재사용성, 유지 보수성 향상

public class Fish {
    String livingSea; //사는 바다
    //속성
    private String sex; //male,female
    private boolean havingPoison; //독 여부
 
    String myInfo() {
        return String.format("물고기(sex=%s, havingPoison=%b, livingSea=%s)",
                this.sex, this.havingPoison, this.livingSea);
    }

    void printMyInfo() {
        System.out.println(myInfo());
    }

    public void setLivingSea(String livingSea) {
        this.livingSea = livingSea;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setHavingPoison(boolean havingPoison) {
        this.havingPoison = havingPoison;
    }
}

public class FishChild extends Fish { //Fish class를 상속받으 FishChild class 생성
    private boolean eatable;

    public void digging() {
        System.out.println(myInfo() + "가 모래를 파고 있다.");
    }

    public boolean isEatable() {
        return eatable;
    }

    public void setEatable(boolean eatable) {
        this.eatable = eatable;
    }
}
 
public class SeaSituation {
    public static void main(String[] args) {
        Fish fish = new Fish();
        fish.setSex("Male");
        fish.setLivingSea("동해");
        fish.setHavingPoison(false);

        FishChild fishChild = new FishChild(); 
            //FishChild class는 Fish를 상속받았기 때문에 Fish에 정의된 메소드 및 변수 사용 가능
        fishChild.setSex("Female");
        fishChild.setLivingSea("서해");
        fishChild.setHavingPoison(false);

        fish.printMyInfo();
        fishChild.printMyInfo();
        fishChild.digging();

        fishChild.setEatable(true); //FishChild class에서 새로 만든 메소드이기때문에 부모클래스인 Fish class에서는 사용 불가
        System.out.println(fishChild.isEatable());
    }
}
 

 

2. protected, 메소드 오버라이딩

1) protected

2) 메소드 오버라이딩 : 부모 클래스에서 상속받은 메소드를 자식 클래스에서 재정의하여 사용.

package exercise.chapter_31;

public class Fish {
    protected boolean havingPoison; //독 여부

    void eat(String food) {
        System.out.println(myInfo() + "는 " + food + "을/를 먹는다");
    }
}



public class FishChild extends Fish {
    private boolean eatable;

    public void becomeDanger() {
        this.havingPoison = true; //부모클래스의 protected 변수인 havingPoison 변수 접근
    }

    @Override
        //오버라이딩 표시
    void eat(String food) { //자식 클래스에서 메소드 재정의
        System.out.println(myInfo() + "는 " + food + "를 아주 열심히 먹고 있습니다");
    }
}

 

3. Java super 사용법

- super를 활용해 부모 객체의 속성, 생성자를 호출할 수 있다.

부모클래스
Base Class
Super Class
Parent Class
자식클래스
Derived Class
Sub Class
Child Class

- super는 부모 클래스의 default 생성자 호출

Fish() {
        System.out.println("부모 물고기 생성");
    }

FishChild() {
        //부모 생성자 자동 호출
        //super(); 생략
        System.out.println("자식 물고기 생성");
    }
// 부모 물고기 생성
// 자식 물고기 생성
 
public Fish(boolean havingPoison, String livingSea, String sex, String startSpawningDate, String endSpawningDate) {
        this.havingPoison = havingPoison;
        this.livingSea = livingSea;
        this.sex = sex;
        StartSpawningDate = startSpawningDate;
        this.endSpawningDate = endSpawningDate;
    }
 

 

4. Java 묵시적 형 변화

class Cat extends Animal{}
...

Cat cat = new Cat();

Animal a = cat; //업캐스팅
 

- 업캐스팅 하면 자식클래스에서 확장한 필드와 메소드를 사용할 수 없음.

- 타입은 부모클래스의 타입으로 선언, 자식 클래스 생성하면 ? 자식 클래스의 메소드 실행

Fish fishChild = new FishChild();
fishChild.eat("새우"); //eat 메소드는 부모클래스에는 없음. 자식 클래스 메소드 실행
 
//부모타입 선언, 자식 인스턴스화
        Fish fish = new FishChild();
        fish.eat("새우");

        //부모타입 선언, 부모 인스턴스화
        Fish fish2 = new Fish();
        fish2.eat("새우");

        //자식타입 선언, 자식 인스턴스화
        FishChild fish3 = new FishChild();
        fish3.eat("새우");

        //자식타입 선언, 부모 인스턴스화 ->>불가능
        FishChild fish4 = new Fish();