본문 바로가기
개발 공부 Today I Learned

[국비 22일차 TIL] 인터페이스, 상속, 메모리

by 개발자신입 2023. 12. 20.
반응형

- 인터페이스

상속 추상화 인터페이스
단일상속 다중상속
class, interface  

 

인터페이스(implements)에는 추상 메소드만 들어갈 수 있음. (강제성)

다른 언어에서 찾기 힘든 자바의 고급 기능.

 

  • 클래스 : 일반 메소드를 가질 수 있음
  • 추상 클래스 : 일반 메소드, 추상 메소드를 가질 수 있음
  • 인터페이스 : 오로지 추상 메소드만 가질 수 있음, 무조건 추상.

 

인터페이스 내에 존재하는 메소드는 무조건 public abstract 로 선언함. (abstract 없어도 가능)

인터페이스 내에 존재하는 변수는 무조건 public static final 로 선언함.

 

인터페이스에서 가질 수 있는 것들 : 상수, 추상 메소드

 

인터페이스는 다중 상속과 비슷한 기능 제공

 

interface 인터페이스명 {

void 추상메소드(); // {} 바디가 없고, 세미콜론으로 끝나야 함.

}

 

class 클래스명 implements 인터페이스명 {

인터페이스에 있는 미구현 메소드 오버라이드 (필수)

}

 

상속과의 차이점

* 상속 : class A extends B // B라는 클래스 상속받아 A의 기능을 더함

> 순수 상속 : 부모로부터 모든 권한과 재산 능력을 가져오기

 

* 인터페이스 : class A implements B // B라는 인터페이스를 구현함

> 권한 상속 : 인터페이스만 가져오기. 비어있는 것을 가져와서 내용을 만들어주기

 

 

interface Do {
	// 메소드 : 추상 메소드 (바디가 없어야 하고, ;로 끝나야 함)
	public abstract void attack();
	public void play();
}

abstract class Hero {	// 추상 클래스화 : {}바디 삭제, ; 으로 마무리, abstract 추가
	String name;
}

class Superman extends Hero implements Do {

	@Override
	public void attack() {	
	}

	@Override
	public void play() {	
	}
}

public class Inter01 {
}
package com.coffee.inter;
 
interface SayHi {
	public static final int NUMBER = 0;		// 상수(대문자로)
	
	public void SayHello();
	public void SayBye();
}

public class Inter02 implements SayHi {

	@Override
	public void SayHello() {		// 오버라이드로 내용 채워주기. 바디만 있어도 인정
	}

	@Override
	public void SayBye() {
	}	
}

 

동물 카테고리

package Zoo;

public class Animal {
	String name;
	int age;
	public void setName(String name) {
		this.name = name;
	}
}
package Zoo;

public interface predator {
	public abstract String getName(); // 이름 불러오기 = 추상 메소드 (바디 없음, 구현불가)

}
package Zoo;

public class Zoo {
	public static void main(String[] args) {
		Zootrainer trainer = new Zootrainer();
		Dog dog = new Dog();
		dog.setName("댕댕이");
		trainer.feed(dog);
		
		Cat cat = new Cat();
		cat.setName("콩이");
		
		Mouse mouse = new Mouse();
		mouse.setName("쥐돌이");
		trainer.feed(cat);
		trainer.feed(mouse);
		
	}
}
package Zoo;

public class Dog extends Animal implements predator {

	@Override
	public String getName() {
		return name;
	}
}

// Cat, Mouse....
package Zoo;

public class Zootrainer {
	public void feed(predator predator) {
		System.out.println(predator.getName()+"에게 밥을 줍니다.");		
	}
}

 


어벤져스 어셈블~

package avangers;

public class Hero {
	
	String name;
	int age;
	int hp;
}
package avangers;

public class Ironman extends Hero implements Attack, Fly, javis {

	@Override
	public void makeSuit(int count) {
		System.out.println("수트 생성");
	}

	@Override
	public void fly() {
		System.out.println("하늘로 날아");
	}

	@Override
	public void attack() {
		System.out.println("레이저 발사");
	}

	@Override
	public void defence() {
		// TODO Auto-generated method stub

	}
}
package avangers;

public class Spiderman extends Hero implements Attack {

	@Override
	public void attack() {
		System.out.println("거미줄");
	}

	@Override
	public void defence() {
		System.out.println("거미줄 방어");		
	}
}

// Kang, Flerken...
package avangers;

public interface javis {
	public abstract void makeSuit(int count);

}
package avangers;

public class Avangers {
	public static void main(String[] args) {
		
		// 인스턴스 생성
		Ironman ironman = new Ironman();
		Spiderman spiderman = new Spiderman();
		Kang kang = new Kang();
		Flerken flerken = new Flerken();
				
		ironman.fly();
		spiderman.attack();
		kang.defence();
		flerken.defence();
	}
}

 


 

is a & has a (상속관계)

is a : ~ ~.

has a : ~ ~를 가지고 있다.

 


class Human {
	String name;
	int age;
} 	
class Student extends Human {
	int number;
	int major;
 }

Student class가 Human class를 상속받고 있음.
학생은 사람이다. is a
 
class Gun {
	String name;
	int short;
 }
  
 class police {
 	Gun gun;	// 멤버 객체로 총을 가져감.
 }
 
경찰은 총을 가지고 있다.
경찰 클래스 안에 권총 클래스 객체를 멤버로 가지고 있는 경우 has a


public class IsAHasA {

}

 


 

[ 중요 ] 호출 스택은 예외처리 할 때 필요함.

메소드 영역

클래스 데이터 (클래스 변수)

프로그램 실행 중 어떤 클래스가 사용되면 JVM은 해당 클래스 파일을 읽어 클래스 데이터를 이곳에 저장함.

동시에 클래스 변수도 이곳에 생성함.

 

호출 스택

메인 메소드 (지역변수)

메소드가 작업에 필요한 메모리 공간을 제공.

메소드가 호출되면 호출 스택에 메소드 활용을 위한 메모리가 할당됨.

메모리에서 메소드가 작업을 수행하는 동안 지역변수와 연산의 중간 결과가 저장됨.

 

메소드가 작업을 마치면 할당되었던 메모리 공간은 반환 -> 비워짐

 

호출 스택은 제일 상위에 있는 메소드가 지금 실행중인 메소드

 

나머지는?

나머지는 모두 대기함.

언제나 호출스택 최상위에 있는 메소드가 지금 실행중인 메소드임.

아래에 있는 메소드는 바로 위에 있는 메소드를 호출한 메소드임.

 

: 인스턴스가 생성되는 공간, 인스턴스 변수

 

리턴타입이 있는 메소드는 종료되기 직전 결과값을 반환함.

누구에게? 자신을 호출한 메소드에게 결과값을 반환함.

누구 ? 대기 중인 호출 메소드가 받아서 프로그램을 진행.

 

 

실행되는 순서 알아보기

public class Memory {
	public static void main(String[] args) {
		
		System.out.println("메인 메소드 시작"); // 1
		System.out.println("메인 메소드 작업중"); // 2
		first();
		System.out.println("메인 메소드 끝"); // 9
	}
	static void first() {
		System.out.println("메인 메소드 시작"); // 3
		System.out.println("메인 메소드 작업중"); // 4
		second();
		System.out.println("메인 메소드 끝"); // 8
	}
	static void second() {
		System.out.println("두번째 메소드 시작"); // 5
		System.out.println("메인 메소드 작업중"); // 6
		System.out.println("두번째 메소드 끝"); // 7
	}
}
반응형

댓글