자바 인터페이스
package com.poseidon.inter;
// 인터페이스
/* 자바 기초, 제어문, || 객체 지향 프로그래밍 -> 클래스, 메소드, 상속, 추상화
* 자료 구조 : R/P 타입, 배열, 스트링, SB
* 알고리즘 :
*
* 상속 -> 추상화 -> 인터페이스
* class interface
* 단일상속 다중상속
*
*
* 인터페이스는 다른 언어에서 찾기 힘든 자바의 고급 기능
* 왜, 어떻게 사용하는지, 특징 설명
*
* 인터페이스 란 ?
* 클래스 : 일반 메소드를 가질 수 있음
* 추상 클래스 : 일반 메소드와 추상 메소드를 가질 수 있음
* 인터페이스 : 오직 추상 메소드만 가질 수 있음
* 인터페이스 내에 존재하는 메소드는 무조건 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 abstract void play() { System.out.println("플레이"); } // 메소드가 완성되면 안됨
public void play();
}
abstract class Hero { // 추상 클래스 = 미완성된 클래스
String name;
public abstract void attack(); // 추상 메소드 = 미완성된 메소드
}
class Superman extends Hero implements Do{
@Override // 부모의 메소드를 자식이 재정의하여 자신이 원하는 내용으로 수정
public void attack() { // 바디만 ({}) 열어도 수정한 것으로 봄
}
@Override
public void play() {
}
}
public class Inter01 {
}
자바 상속과 인터페이스 활용하기
package Zoo;
// 클래스 1 번
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;
// 클래스 2 번
public class Dog extends Animal implements Predator{
@Override
public String getName() {
return name;
}
}
package Zoo;
// 클래스 3 번
public class Cat extends Animal implements Predator{
@Override
public String getName() {
return name;
}
}
package Zoo;
// 클래스 4 번
public class Mouse extends Animal implements Predator{
@Override
public String getName() {
return name;
}
}
package Zoo;
// 클래스 5 번
public class ZooTrainer {
// 밥주기 기능
public void feed(Predator predator) {
System.out.println(predator.getName() + " 에게 먹이를 줍니다.");
}
}
package Zoo;
public class Zoo {
public static void main(String[] args) {
ZooTrainer zooTrainer = new ZooTrainer();
Dog dog = new Dog();
dog.setName("3PO");
zooTrainer.feed(dog); // 3PO 에게 먹이를 줍니다. 출력
Cat cat = new Cat();
Mouse mouse = new Mouse();
cat.setName("야옹이");
mouse.setName("찍찍이");
zooTrainer.feed(cat); // 야옹이 에게 먹이를 줍니다.
zooTrainer.feed(mouse); // 찍찍이 에게 먹이를 줍니다.
}
}
Is a, Has a
/*
* 상속 관계 중 is a, has a 관계가 있음
*
* 말 그대로 is a -> ~ 는 ~ 다.
* has a -> ~ 는 ~ 를 가지고 있다.
*
* class Human {
* String name;
* int age;
* }
*
* class Student extends Human {
* int number;
* int major;
* }
*
* Student 클래스가 Human 클래스를 상속 받고 있음
* 학생은 사람이다.
*
* class Gun {
* String name;
* int shot;
* }
*
* class Police {
* Gun gun; // 멤버 객체로 총을 가져감
* }
*
* 경찰은 총을 가지고 있음
* Police 클래스 안에 Gun 클래스 객체를 멤버로 가지고 있는 경우 has a
*/
public class IsAHasA {
}
메모리 구조
package memory;
// 메모리 구조
/*
* 중요 : 호출 스택은 예외처리 할 때 필요
*
* 메소드 영역 : 클래스 데이터 (클래스 변수)
* 프로그램 실행 중 어떤 클래스가 사용되면 JVM 은 해당 클래스 파일을 읽어
* 클래스 데이터를 이곳에 저장, 동시에 클래스 변수도 이곳에 생성
*
* 호출 스택 : 메인 메소드 (지역 변수)
* 메소드가 작업에 필요한 메모리 공간을 제공
* 메소드가 호출되면 호출 스택에 메소드 활용을 위한 메모리가 할당
* 메모리에서 메소드가 작업을 수행하는 동안 지역 변수와 연산의 중간 결과가 저장
* 메소드가 작업을 마치면 할당되었던 메모리 공간은 반환 - > 비워짐
* 호출 스택은 제일 상위에 있는 메소드가 지금 실행중인 메소드
* 나머지는 모두 대기, 언제나 호출 스택 최상위에 있는 메소드가 현재 실행 중인 메소드
* 아래에 있는 메소드는 바로 위에 있는 메소드를 호출한 메소드
*
* 힙 : 인스턴스가 생성되는 공간
* 인스턴스 변수
*
* 리턴 타입이 있는 메소드는 종료되기 직전 자신을 호출한 메소드에게 결과 값을 반환
* 대기하고 있는 호출 메소드가 값을 받아 프로그램을 진행
*/
public class Memory {
public static void main(String[] args) {
System.out.println("main method start");
System.out.println("메인 메소드 작업 중");
first();
System.out.println("main method end");
}
static void first() {
System.out.println("first method start");
System.out.println("first 메소드 작업 중");
second();
System.out.println("first method end");
}
static void second() {
System.out.println("second method start");
System.out.println("second 메소드 작업 중");
System.out.println("second method end");
}
}
/* 출력 결과
main method start
메인 메소드 작업 중
first method start
first 메소드 작업 중
second method start
second 메소드 작업 중
second method end
first method end
main method end
*/
열거형 enum
package enumEx;
// 열거형 타입
/*
* 열거한 값만 사용할 수 있음
* static final 값 = 상수, 대문자로 작성
* enum 은 클래스 이름과 중복될 수 없고 같은 값을 가질 수 없음
*/
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
'JAVA' 카테고리의 다른 글
231222 Java (0) | 2023.12.22 |
---|---|
231221 Java (2) | 2023.12.21 |
231219 Java (0) | 2023.12.19 |
231218 Java (0) | 2023.12.18 |
231215 Java 객체지향 (0) | 2023.12.15 |