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();