728x90

순수 추상 클래스

= 모든 메소드가 추상 메소드라서 코드를 실행할 바디가 없다

다형성을 위한 부모타입으로써 껍데기 역할만 제공

 

a. 인스턴스를 생성할 수 없다

b. 상속시 자식은 모든 메소드를 오버라이딩 해야한다

c. 주로 다형성을 위해 사용된다

 


인터페이스

순수 추상클래스와 동일하지만 + @

  • public abstract 생략이 가능(생략이 권장됨!)
  • 다중 상속을 지원한다

 

인터페이스를 사용하는 이유

  • 제약 - 인터페이스를 구현하는 곳에서 인터페이스를 "반드시" 구현하라는 제약(규약) / 추상메소드가 아니기 때문
  • 다중 구현 - 클래스 상속은 부모를 하나만 지정이 가능하지만 인터페이스는 부모를 다중 상속이 가능하다
interface Addin{
	public int add(int a, int b); // abstract가 생략됨
	public int add(int a);
	/// 메소드 오버로딩
	default void pr(){ // deafault를 붙였으므로 추상메소드가 아님!
		System.out.println("희희");
		
	}
}
class Add implements Addin{
	public int add(int a, int b) {
		return a+b;
	}
	public int add(int a) {
		int sum=0;
		for(int i=1;i<=a;i++) {
			sum+=i;
		}
		return sum;
	}
}
public class mmdd0229 {
	public static void main(String[] args) {
		Add a=new Add();
		System.out.println(a.add(1,4));
		System.out.println(a.add(10));
		//Addin a=new Addin();
	}
}

인터페이스 다중 구현

예시1)

package poly.diamond;

public interface InterfaceA {
    void methodA();
    void methodCommon();
}
package poly.diamond;

public interface InterfaceB {

    void methodB();
    void methodCommon();
}
package poly.diamond;

public class Child implements InterfaceA, InterfaceB {


    @Override
    public void methodA() {
        System.out.println("Child.methodA");
    }

    @Override
    public void methodB() {
        System.out.println("Child.methodB");
    }

    @Override
    public void methodCommon() {
        System.out.println("Child.methodCommon");

    }
}
package poly.diamond;

public class DiamondMain {
    public static void main(String[] args) {
        InterfaceA a = new Child();
        a.methodA();
        a.methodCommon();

        InterfaceB b = new Child();
        b.methodB();
        b.methodCommon();
    }
}

 

예시2)

interface Animal{
 public void bear();
}
interface Fish{
	 public void swim();
}
class A implements Animal, Fish{ //다중상속
	@Override
	public void bear(){
		System.out.println("낳는다");
	}
	@Override
	public void swim() {
		System.out.println("수영한다");
	}
}
public class mmdd0229 {
	public static void main(String[] args) {
	
		A a = new A();
		a.bear();
		a.swim();
		
		
	}
}

예시2)

interface A{
	public void funcA();//추상 메소드
}
interface B{
	public void funcB();//추상 메소드
}
interface C extends A,B{ //다중상속
	public void funcC();//추상 메소드
}
class D implements C{
	@Override
	public void funcA() {
		System.out.println("funcA");
	}
	@Override
	public void funcB() {
		System.out.println("funcB");
	}
	@Override
	public void funcC() {
		System.out.println("funcC");
	}
}
public class test {

	public static void main(String[] args) {
		
		D d1=new D();
		A a1=d1; //업캐스팅
		a1.funcA();
		
		B b1=d1; //업캐스팅
		b1.funcB();
		
		C c1=d1; //업캐스팅
		c1.funcA();
		c1.funcB();
		c1.funcC();
		
		

	}

}

클래스 상속과 인터페이스 구현

다중상속일때 (인터페이스 2개 이상일때!)
  • public class Classname implements interfaceA, interfaceB
  • public interface 자식interface extends 부모interface1, 부모interface2

예시1)

package poly.ex6;

public interface Fly {
    void fly(); // 추상메소드
}
package poly.ex6;

public abstract class AbstractAnimal {
    public abstract void sound();
    public void move(){
        System.out.println("동물이 이동합니다.");
    }
}
package poly.ex6;

public class Dog extends AbstractAnimal{
    @Override
    public void sound() {
        System.out.println("머엉");
    }
}
package poly.ex6;

public class Bird extends AbstractAnimal implements Fly{
    @Override
    public void sound() {
        System.out.println("까악");
    }

    @Override
    public void fly() {
        System.out.println("푸덕");
    }
}
package poly.ex6;

public class Chicken extends AbstractAnimal implements Fly{
    @Override
    public void sound() {
        System.out.println("꼬끼오");
    }

    @Override
    public void fly() {
        System.out.println("푸드덕푸드덕");
    }
}
package poly.ex6;



public class SoundFlyMain {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Bird bird = new Bird();
        Chicken chicken = new Chicken();

        soundAnimal(dog);
        soundAnimal(bird);
        soundAnimal(chicken);

        flyAnimal(bird);
        flyAnimal(chicken);

    }

    private static void soundAnimal(AbstractAnimal animal) {
        System.out.println("동물 소리 테스트 시작");
        animal.sound();
        System.out.println("동물 소리 테스트 종료");
    }

    //Fly 인터페이스가 있으면 사용 가능
    private static void flyAnimal(Fly fly){
        System.out.println("날개 테스트 시작");
        fly.fly();
        System.out.println("날개 테스트 종료");
    }
}

 

 

예시2)

interface Po{
	public void pr(int a, String b);
	public void pr(String b);
		
	}
	class Point implements Po{
		@Override
		public void pr(int a, String b){
			System.out.println(b+"는 "+a+"원 입니다.");
		}
		@Override
		public void pr(String b){
			System.out.println(b);
	}
	}
	
public class mmdd0229 {
	public static void main(String[] args) {
	
		Po p=new Point();

		p.pr(30000,"java"); 

		p.pr("python"); }
		
//실행 결과) java책은30000원
//           python

	}

 

예시3)

class Tv{
public void on() {
	System.out.println("티비 켬");
}
}
interface Computer{
public void m();
}
class Com{
public void m() {
	System.out.println("컴");
}
}

class Ipad extends Tv implements Computer{
Com c=new Com();
	
@Override
public void m() {
	c.m(); //System.out.println("컴");
}
public void ip() {
	m();	//컴
	on();  //티비 켬
}
}
public class test {
public static void main(String[] args) {
		
	Ipad i=new Ipad();
	Tv t=i;  //up
	Computer c=i;//up
		
	i.ip();	
}
}
728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 종합예시  (0) 2024.03.08
[JAVA] 객체배열  (1) 2024.03.08
[JAVA] 추상클래스 ★  (0) 2024.03.07
[JAVA] 다형성2 ★  (0) 2024.03.07
[JAVA] 다형성1 ★  (0) 2024.03.07
728x90

추상 클래스  

 

추상적인 개념을 제공하는 클래스지만, 실체인 인스턴스가 존재하지 않고 대신에 상속을 목적으로 사용되고, 부모 클래스 역할을 한다

abstract class AbstractAnimal {
}

 

추상 메소드

 

부모 클래스를 상속받는 자식 클래스가 반드시 오버라이딩 해야 하는 메소드를 부모 클래스에 정의할 수 있다

실체도 존재하지 않고, 메소드 바디 또한 없다

public abstract void sound();

 


추상 메소드가 하나라도 있는 클래스는 추상 클래스로 선언해야 한다

추상 메소드는 상속 받는 자식 클래스가 반드시 오버라이딩 해서 사용해야 한다

 

예시1)

package poly.ex3;

public abstract class AbstractAniaml {

    public abstract void sound();

    public void move(){
        System.out.println("동물이 움직입니다.");
    }
}
package poly.ex3;

public class Cat extends AbstractAniaml{
    @Override
    public void sound() {
        System.out.println("냥이는 야옹!");

    }
}
package poly.ex3;

public class Caw extends AbstractAniaml{
    @Override
    public void sound() {
        System.out.println("소는 음메!");
    }
}
package poly.ex3;

public class Dog extends AbstractAniaml{

    @Override
    public void sound() {
        System.out.println("개는 멍멍이다!");
    }
}
package poly.ex3;

public class AbstractMain {

    public static void main(String[] args) {
        //추상클래스 생성 불가
        //AbstractAnimal animal = new AbstractAimal

        Dog dog = new Dog();
        Cat cat = new Cat();
        Caw caw = new Caw();

        cat.sound();
        cat.move();

        soundAnimal(dog);
        soundAnimal(cat);
        soundAnimal(caw);
    }

    //변하지 않는 부분 //범위 지정 후 ctrl + m 하면 메소드 생성됨
    private static void soundAnimal(AbstractAniaml animal) {
        System.out.println("동물 소리 테스트 시작");
        animal.sound();
        System.out.println("동물 소리 테스트 종료");
    }
}

 

예시2)

import java.util.Scanner;

abstract class Car{
	String name; // 필드
	
	void run() { // 일반적 메소드
		System.out.println("차가 움직인다");
	}
	abstract void stop(); // 추상 메소드(empty mathod)
							//추상은 구현이 안되고 선언만 가능!
}
// 추상클래스 안에는 일반적인, 추상적인 메소드 둘 다 가능 
// but, 추상메소드는 반드시 추상클래스 안에 있어야함!

class Cars extends Car{
	@Override //컴파일 체크 오버라이드!
	void stop() {
		System.out.println("차가 멈춘다");
	}
}

public class mmdd0229 {
	public static void main(String[] args) {

		Cars c=new Cars(); // 객체 생성 -> 생성자 호출
		c.run(); // 메소드 호출
		c.stop();// 메소드 호출		
	}
}

 

 예시3)

import java.util.Scanner;

abstract class Ca{
	abstract int add(int a, int b);
	abstract double avg(int a[]);  // 추상 = 선언만 하고
}
class Cal extends Ca{ // 구현은 추상클래스에서 상속받아서 시행
	@Override
	int add(int a, int b) {
		  return a+b;
	}
	@Override
	double avg(int a[]) { // 배열평균 for-each문 활용
		int sum=0;
		for(int ary:a) {
			sum+=ary;
		}
		return ((double)sum/a.length);
	}
}

public class mmdd0229 {
	public static void main(String[] args) {

		Cal c=new Cal();
		System.out.println(c.add(3,7));
		System.out.println(c.avg(new int[] {1,2,3}));
	}
}

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 객체배열  (1) 2024.03.08
[JAVA] 인터페이스 ★  (0) 2024.03.08
[JAVA] 다형성2 ★  (0) 2024.03.07
[JAVA] 다형성1 ★  (0) 2024.03.07
[JAVA] 상속★  (1) 2024.03.05
728x90

다형성 참조 및 메소드 오버라이딩을 활용한 중복제거

package poly.ex;

public class Cat {
    public void sound() {
        System.out.println("냐옹");
    }
}
package poly.ex;

public class Caw {
    public void sound() {
        System.out.println("음매");
    }
}
package poly.ex;

public class Dog {
    public void sound() {
        System.out.println("멍멍");
    }
}
package poly.ex;

public class AnimalSoundMain {

    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        Caw caw = new Caw();

        System.out.println("동물 소리 테스트 시작");
        dog.sound();
        System.out.println("동물 소리 테스트 종료");

        System.out.println("동물 소리 테스트 시작");
        cat.sound();
        System.out.println("동물 소리 테스트 종료");

        System.out.println("동물 소리 테스트 시작");
        caw.sound();
        System.out.println("동물 소리 테스트 종료");

        soundCaw(caw);
    }

    private static void soundCaw(Caw caw){
        System.out.println("동물 소리 테스트 시작");
        caw.sound();
        System.out.println("동물 소리 테스트 종료");
    }
}

 

중복되는 문장이 너무 많음, 중복을 제거하기 위해서는 배열이나 for문을 활용해야 하지만 cat, caw, dog는 다른 클래스이기 때문에 활용이 불가하다

 

그래서 메소드 오버라이딩을 통해 최적화가 가능하다

 

package poly.ex2;

public class Animal {
    public void sound() {
        System.out.println("동물 울음 소리");
    }
}
package poly.ex2;

public class Cat extends Animal{
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}
package poly.ex2;

public class Caw extends Animal{
    @Override
    public void sound() {
        System.out.println("음메");
    }
}
package poly.ex2;

public class Dog extends Animal{
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}
package poly.ex2;

public class AnimalPolyMain1 {

    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        Caw caw = new Caw();
        soundAnimal(dog);
        soundAnimal(cat);
        soundAnimal(caw);
    }

    private static void soundAnimal(Animal animal){
        System.out.println("동물 소리 테스트 시작");
        animal.sound();
        System.out.println("동물 소리 테스트 종료");
    }
}

 

 

배열과 for문을 활용하여 중복 제거

 

package poly.ex2;

public class Animal {
    public void sound() {
        System.out.println("동물 울음 소리");
    }
}
package poly.ex2;

public class Cat extends Animal{
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}
package poly.ex2;

public class Caw extends Animal{
    @Override
    public void sound() {
        System.out.println("음메");
    }
}
package poly.ex2;

public class Dog extends Animal{
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}
package poly.ex2;

public class AnimalPolyMain2 {

    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        Caw caw = new Caw();

        Animal[] animalArr = {dog, cat, caw};

        //변하지 않는 부분
        for (Animal animal : animalArr) {
            System.out.println("동물 소리 테스트 시작");
            animal.sound();
            System.out.println("동물 소리 테스트 종료");

        }
    }
}

 

More 최적화!

package poly.ex2;

public class AnimalPolyMain3 {

    public static void main(String[] args) {
        Animal[] animalArr = {new Dog(), new Cat(), new Caw()};

        //변하지 않는 부분
        for (Animal animal : animalArr) {
            SoundAnimal(animal);

        }
    }

    //변하지 않는 부분 //범위 지정 후 ctrl + m 하면 메소드 생성됨
    private static void SoundAnimal(Animal animal) {
        System.out.println("동물 소리 테스트 시작");
        animal.sound();
        System.out.println("동물 소리 테스트 종료");
    }
}

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 인터페이스 ★  (0) 2024.03.08
[JAVA] 추상클래스 ★  (0) 2024.03.07
[JAVA] 다형성1 ★  (0) 2024.03.07
[JAVA] 상속★  (1) 2024.03.05
[JAVA] Final 변수  (0) 2024.03.05
728x90

객체지향 프로그래밍 특징

1. 캡슐화

2. 상속

3. 다형성

 

다형성 = 한 객체가 여러 타입의 객체로 취급 될 수 있는 능력

 

다형적 참조

"부모는 자식을 품을 수 있다!"

 

예시) 다형적 참조

package poly.basic;
public class Parent {
  public void parentMethod() {
	 System.out.println("Parent.parentMethod");
   }
}
package poly.basic;
public class Child extends Parent {
   public void childMethod() {
 	System.out.println("Child.childMethod");
   }
}
package poly.basic;

  // 다형적 참조: 부모는 자식을 품을 수 있다.
 
public class PolyMain {
   public static void main(String[] args) {
 	
    //부모 변수가 부모 인스턴스 참조
    //메모리 상에 Parent만 생성
 	System.out.println("Parent -> Parent");
 	Parent parent = new Parent();
 	parent.parentMethod();
    
 	//자식 변수가 자식 인스턴스 참조
   	//메모리 상에 Parent와 Child 모두 생성
	 System.out.println("Child -> Child");
     Child child = new Child();
 	 child.parentMethod();
	 child.childMethod();
     
 	//부모 변수가 자식 인스턴스 참조(다형적 참조)
    	//메모리 상에 Parent와 Child 모두 생성
 	System.out.println("Parent -> Child");
 	Parent poly = new Child();
	poly.parentMethod();
     
 	//Child child1 = new Parent(); 자식은 부모를 담을 수 없다
    
 	//자식의 기능은 호출할 수 없다. 컴파일 오류 발생
 	//poly.childMethod();
    
    /*
    poly 가 자식 타입인 Child 에 있는 childMethod() 를 호출하면 먼저 참조값을 통해 인스턴스를 찾는다.
    그 다음으로는 인스턴스 안에서 실행할 타입을 찾아야 한다.
    호출자인 poly 는 Parent 타입, 따라서 Parent 클래스부터 시작해서 필요한 기능을 찾는다.
    그런데 상속 관계는 부모 방향으로 찾아 올라갈 수는 있지만 자식 방향으로 찾아 내려갈 수는 없다.
    Parent 는부모 타입이고 상위에 부모가 없다.
    따라서 childMethod() 를 찾을 수 없으므로 컴파일 오류가 발생한다.
    */
 }
}

 

부모의 마음은 넓기에 자식을 품을 수 있지만,

자식은 부모를 품을 수 없다

 

자바에서 부모 타입은 자신은 물론이고, 자신을 기준으로 모든 자식 타입을 참조할 수 있다

이것이 바로 다양한 형태를 참조할 수 있다고 해서 다형적 참조라 한다

 

다형성과 캐스팅

다운캐스팅

package poly.basic;

public class CastingMain1 {

    public static void main(String[] args) {
        //부모 변수가 자식 인스턴스 참조(다형적 참조)
        Parent poly = new Child();
        // 단 자식의 기능은 호출 불가
        //poly.childMethod();

        //강제형변환(다운캐스팅)
        Child child = (Child) poly; // (Poly=Parent타입)x001
        child.childMethod();
    }
}

 

부모는 자식을 담을 수 있지만 자식은 부모를 담을 수 없다!

부모는 가능!

Parent parent = new Child() // 부모는 자식을 담을 수 있다.
Parcent parent = child // Child child 변수 // 부모는 자식을 담을 수 있다.

 

 

자식은 부모를 담을 수 없다!

Child child = poly // Parent poly 변수

 

 

하지만 다운캐스팅을 하면 사용이 가능하다

Child child = (Child) poly // poly는 Parent 타입인데 Child로 다운캐스팅함

 

 

 

캐스팅 종류

일시적 다운캐스팅

package poly.basic;

public class CastingMain2 {
    public static void main(String[] args) {
        //부모 변수가 자식 인스턴스 참조(다형적 참조)
        Parent poly = new Child();
        //단 자식의 기능은 호출할 수 없다. 컴파일 오류 발생
        //poly.childMethod();


        //일시적 다운캐스팅 - 해당 메서드를 호출하는 순간만 다운캐스팅
        ((Child) poly).childMethod();
        //연산자 순서가 애매할땐 괄호를 치면된다
    }
}

 

 

 

업캐스팅(자동형변환)

package poly.basic;

//업캐스팅 다운캐스팅 비교
public class CastingMain3 {

    public static void main(String[] args) {
        Child child = new Child();
        Parent parent1 = (Parent) child; //업캐스팅은 생략 가능, 생략 권장!
        Parent parent2 =  child; //생략

        parent1.parentMethod();
        parent2.parentMethod();
        
    }
}

 

 


instanceof

변수가 참조하는 인스턴스의 타입을 확인하고 싶다면 intanceof를 사용하면 된다

 

package poly.basic;

public class CastingMain5 {
    public static void main(String[] args) {
        Parent parent1 = new Parent();
        System.out.println("Parent1 호출");
        call(parent1);

        Parent parent2 = new Child();      
        System.out.println("Parent2 호출");
        call(parent2);

    }

    private static void call(Parent parent){
        parent.parentMethod();
        if(parent instanceof Child){
            System.out.println("Child 인스턴스가 맞음");
            Child child = (Child) parent;
            child.childMethod();
        }
    }
}
--------------------------------------------------------

Parent1 호출
Parent.parentMethod
Parent2 호출
Parent.parentMethod
Child 인스턴스가 맞음
Child.childMethod

 

오른쪽에 있는 타입에 왼쪽에 있는 인스턴스의 타입이 들어갈 수 있는지 대입해보면 되는데, 대입이 가능하면 true, 불가능하면 false가 된다

 

예시)

new Parent() instanceof Parent
Parent p = new Parent() //같은 타입 true

new Child() instanceof Parent
Parent p = new Child() //부모는 자식을 담을 수 있다. true

new Parent() instanceof Child
Child c = new Parent() //자식은 부모를 담을 수 없다. false

new Child() instanceof Child
Child c = new Child() //같은 타입 true

 

Pattern Matching for instanceof(인스턴스동시 변수 선언)

자바 16부터 구현 가능한 기능!

package poly.basic;

public class CastingMain6 {
    public static void main(String[] args) {
        Parent parent1 = new Parent();
        System.out.println("parent1 호출");
        call(parent1);
        Parent parent2 = new Child();
        System.out.println("parent2 호출");
        call(parent2);
    }

    private static void call(Parent parent) {
        parent.parentMethod();
        //Child 인스턴스인 경우 childMethod() 실행
        if (parent instanceof Child child) {
            System.out.println("Child 인스턴스 맞음");
            child.childMethod();
        }
    }
}

 

 

메소드 오버라이딩

오버라이딩 된 메소드가 항상 우선권을 가진다

 

예시)

package poly.overriding;

public class OverridingMain {

    public static void main(String[] args) {
        //자식 변수가 자식 인스턴스 참조
        Child child = new Child();
        System.out.println("Child -> Child");
        System.out.println("value = "+ child.value);
        child.method();

        //부모 변수가 부모 인스턴스 참조
        Parent parent = new Parent();
        System.out.println("Parent -> Parent");
        System.out.println("value = " + parent.value);
        parent.method();

        //부모 변수가 자식 인스턴스 참조
        Parent poly = new Child();
        System.out.println("Parent -> Child");
        System.out.println("value = "+poly.value);// 변수는 오버라이딩 X
        poly.method(); // 메소드는 오버라이딩 O
    }
}

------------------------------------------------------------------
Child -> Child
value = child
child.method
Parent -> Parent
value = parent
parent.method
Parent -> Child
value = parent
child.method

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 추상클래스 ★  (0) 2024.03.07
[JAVA] 다형성2 ★  (0) 2024.03.07
[JAVA] 상속★  (1) 2024.03.05
[JAVA] Final 변수  (0) 2024.03.05
[JAVA] Static  (0) 2024.03.04
728x90

구분

● 부모 클래스(슈퍼 클래스)

자식 클래스(서브 클래스)

 

자식클래스는 부모클래스를 상속받아 사용할 수 있지만, 부모클래스는 자식클래스에 접근이 불가능하다

 

 

단일상속 O / 다중상속 X

다중상속을 하면 클래스 계충 구조가 매우 복잡해지기 때문에 다중상속을 java에선 허용하지 않음

 

 

 

 

예시)

package extends1.ex2;

public class Car {

    public void move(){
        System.out.println("차를 이동합니다.");
    }
}
package extends1.ex2;

public class ElectricCar extends Car{

    public void charge(){
        System.out.println("충전합니다.");
    }
}
package extends1.ex2;

public class GasCar extends Car {

    public void fillup() {
        System.out.println("기름을 주유합니다.");
    }
}
package extends1.ex2;

public class CarMain {
    public static void main(String[] args) {

        ElectricCar electricCar = new ElectricCar();
        electricCar.move();
        electricCar.charge();

        GasCar gasCar = new GasCar();
        gasCar.move();
        gasCar.fillup();

    }
}

 

 

상속과 메모리 구조

1. 호출시에 자식뿐만 아니라 부모클래스까지 모두 생성이 된다
2. 호출시에 생성된것 중에 호출하는 변수의 타입(클래스)를 기준으로 선택한다
3. 현재 타입에서 기능을 찾지 못하면 부모 타입으로 기능을 찾아서 실행하고, 찾지못한다면 컴파일 에러

 

 

메소드 오버로딩

=같은 이름의 메소드를 여러개 정의

메소드 이름이 같고 매개변수(파라미터)가 다른 메소드를 여러개 정의하는 것

 

메소드 오버라이딩 (@Override)

 

= 부모의 기능을 자식이 새로 재정의 하는것

@ 에노테이션을 함으로써 마치 주석과 비슷한 효능을 가짐, 오버라이딩이 제대로 되지 않으면 컴파일 에러 송출

생략도 가능하다, but 작성하는것을 추천!

 

 

 

상속과 접근제어

본인 타입에 없으면 부모 타입에서 기능을 찾고, 이 때 접근제어자가 활용됨

객체 내부에서는 자식과 부모가 구분되어 있어 자식 타입에서 부모 타입을 호출 할 때, 부모 입장에서 보면 외부에서 호출된 것과 동일함

 

예시)

package extends1.access.parent;

public class Parent {

    public int publicValue;
    protected int protectedValue;
    int defaultValue;
    private int privateValue;

    public void publicMethod(){
        System.out.println("Parent.publicMethod");
    }

    protected void protectedMethod(){
        System.out.println("Parent.protectedMethod");
    }

    void defaultMethod(){
        System.out.println("Parent.defaultMethod");
    }

    private void privateMethod(){
        System.out.println("Parent.privateMethod");
    }

    public void printParent() {
        System.out.println("==parent 메소드 안 ==");
        System.out.println("publicValue =" + publicValue);
        System.out.println("protectedValue ="+protectedValue);
        System.out.println("defaultValue ="+defaultValue);
        System.out.println("privateValue ="+privateValue);

        //부모 메소드 안에서 모두 접근 가능
        defaultMethod();
        privateMethod();
    }

}
package extends1.access.parent.child;

import extends1.access.parent.Parent;

public class Child extends Parent {

    public void call() {
        publicValue = 1;
        protectedValue = 1; // 상속관계 or 같은 패키지
        //defaultValue = 1; // 다른 패키지 접근 불가, 컴파일 오류
        //privateValue = 1; // 접근 불가, 컴파일 오류

        publicMethod();
        protectedMethod(); // 상속관계 or 같은 패키지
        //defaultMethod(); // 다른 패키지 접근 불가, 컴파일 오류
        //privateMethod(); // 접근 불가, 컴파일 오류

        printParent();
    }

}
package extends1.access;

import extends1.access.parent.child.Child;

public class ExtendsAccessMain {

    public static void main(String[] args) {
        Child child = new Child();
        child.call();

    }
}

 

 

 

 

Super()

→ 부모클래스에 대한 참조!

 

package extends1.super1;

public class Parent {

    public String value = "parent";

    public void hello(){
        System.out.println("Parent.hello");
    }
}
package extends1.super1;

public class Child extends Parent {

    public String value = "child";

    @Override
    public void hello(){
        System.out.println("Child.hello");
    }

    public void call(){
        System.out.println("this value ="+this.value); //this 생략가능
        System.out.println("super value ="+super.value);

        this.hello(); // this 생략가능
        super.hello();

    }

}
package extends1.super1;

public class Super1Main {

    public static void main(String[] args) {
        Child child = new Child();
        child.call();
    }
}

-------------------------------------
//this value =child
//super value =parent
//Child.hello
//Parent.hello

 

 

super - 생성자

상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야함(규칙)

 

→ 부모의 데이터를 먼저 초기화 하고 자식의 데이트를 초기화

 

 

예시)

package extends1.super2;

public class ClassA {

    public ClassA(){
        System.out.println("ClassA 생성자");
    }
}
package extends1.super2;

public class ClassB extends ClassA {

    public ClassB(int a){
        super(); //매개변수 없는 기본생성자 생략 가능
        System.out.println("ClassB 생성자 a="+a);
    }

    public ClassB(int a, int b){
        super(); // 기본생성자 생략 가능
        System.out.println("ClassB 생성자 a="+a+" b="+b);
    }
}
package extends1.super2;

public class ClassC extends ClassB{

    public ClassC() {
        super(10,20); // 부모가 기본 생성자가 없으면 개발자가 직접 정의해야함
        System.out.println("ClassC 생성자");
    }
}
package extends1.super2;

public class Super2Main {

    public static void main(String[] args) {
        ClassC classC = new ClassC();

    }
}

 

 

 


쇼핑몰 상속 관계 상품

 

 

package extends1.ex;

public class Item {
    private String name;
    private int price;

    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }
        public int getPrice(){
            return price;
    }
        public void print(){
            System.out.println("이름: "+name+" 가격: "+price);
        }
    }
package extends1.ex;

public class Book extends Item{
    private String author;
    private String isbn;

    public Book(String name, int price, String author, String isbn){
        super(name,price);
        this.author=author;
        this.isbn=isbn;

    }
    @Override
    public void print(){
        super.print();
        System.out.println("-저자:"+author+", isbn:"+isbn);
    }
}
package extends1.ex;

public class Album extends Item{
    private String artist;

    public Album(String name, int price, String artist){
        super(name,price);
        this.artist=artist;
    }
    @Override
    public void print(){
        super.print();
        System.out.println("- 아티스트:"+artist);
    }
}
package extends1.ex;

public class Movie extends Item{
    private String director;
    private String actor;

    public Movie(String name, int price, String director, String actor){
        super(name,price);
        this.director=director; this.actor=actor;
    }
    @Override
    public void print(){
        super.print();
        System.out.println("- 감독:"+director+" 배우:"+actor);
    }
}
package extends1.ex;

public class ShopMain {

    public static void main(String[] args) {
        Book book = new Book("JAVA", 10000, "han", "12345");
        Album album = new Album("앨범1", 15000,"seo");
        Movie movie = new Movie("영화1", 18000,"감독1", "배우1");
        book.print();
        album.print();
        movie.print();
        int sum = book.getPrice() + album.getPrice() + movie.getPrice();
        System.out.println("상품 가격의 합: " + sum);
    }
}

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 다형성2 ★  (0) 2024.03.07
[JAVA] 다형성1 ★  (0) 2024.03.07
[JAVA] Final 변수  (0) 2024.03.05
[JAVA] Static  (0) 2024.03.04
[JAVA] 접근 제어자  (0) 2024.03.03
728x90

final 변수는 지역변수에 설정하는 경우 최초 1회만 설정이 가능

이후 변수값을 수정하려 하면 컴파일 에러 발생함

매개변수에 final이 붙으면 메소드 내부에서 매개변수의 값을 변경할 수 없다

 

final 지역변수

package final1;

public class FinalLocalMain {

    public static void main(String[] args) {
        //final 지역변수
        final int data1;
        data1 = 10; // 최초 1회만 할당 가능
       // data2 = 20; // 컴파일 오류

        //final 지역변수2
        final int data2 = 10;
        //data2 = 20; // 컴파일 오류
    }

    static void method(final int parameter){
       // parameter = 20; // 컴파일 오류
    }
}

 

 

final 필드(멤버변수)

 

final을 필드에 사용할 경우 해당 필드는 생성자를 통해 한번만 초기화 가능

package final1;

public class ConstructInit {

    final int value;

    public ConstructInit(int value){
        this.value = value;
    }
}

 

 

final 필드를 필드에서 초기화 하면 이미 값이 설정되어서 생성자를 통해서도 초기화가 불가능

package final1;

public class FinalInit {

    static final int CONST_VALUE = 10;
    final int value = 10;

    /*
    public FinalInit(int value){
        this.value = value;
        컴파일 에러
        */
    }
}

 

package final1;

public class FinalFieldMain {

    public static void main(String[] args) {
    
        //final 필드 - 생성자 초기화
        System.out.println("생성자 초기화");
        ConstructInit constructInit1 = new ConstructInit(10);
        ConstructInit constructInit2 = new ConstructInit(20);
        System.out.println(constructInit1.value);
        System.out.println(constructInit2.value);


        //final 필드 - 필드 초기화
        System.out.println("필드 초기화");
        FieldInit fieldInit1 = new FieldInit();
        FieldInit fieldInit2 = new FieldInit();
        FieldInit fieldInit3 = new FieldInit();
        System.out.println(fieldInit1.value);
        System.out.println(fieldInit2.value);
        System.out.println(fieldInit3.value);


        //상수
        System.out.println("상수");
        System.out.println(FieldInit.CONST_VALUE);
    }
}

---------------------------
생성자 초기화
10
20
필드 초기화
10
10
10
상수
10

 

 

 

 

final변수와 상수

 

●  상수 = 변하지 않는 값, 단 하나의 고정된 값

  그래서 상수는 static final을 사용함

  상수를 쓸 때는 대문자로 작성하고 구분은 _ 로 구분함(관례상)

  필드를 직접 접근하여 사용함

  상수는 런타임에는 변경이 불가능

 

 

final 변수와 참조

 

package final1;
public class Data {
	 public int value;
}

 

int value는 final 이 아니라서 변경이 가능하다!

 

package final1;
public class FinalRefMain {
 public static void main(String[] args) {
 
 	final Data data = new Data();
    
	 //data = new Data(); //final 변경 불가 컴파일 오류
    	 //참조 대상의 값은 변경 가능
 
 	data.value = 10;
	System.out.println(data.value);
    
 	data.value = 20;
 	System.out.println(data.value);
 }
}

 

data.value는 final이 아니기에 값 변경이 가능!

 

 

 

 

종합예시

package final1.ex;

public class Member {

    private final String id; //final 키워드 사용
    private String name;

    public Member(String id, String name){
        this.id = id;
        this.name=name;
    }

    public void changeData(String name){
        this.name = name;
    }

    public void print(){
        System.out.println("id:"+id+", name:"+name);
    }
}
package final1.ex;

public class MemberMain {
    public static void main(String[] args) {
        Member member = new Member("myid","kim");
        member.print();
        member.changeData("seo");
        member.print();
    }
}
728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 다형성1 ★  (0) 2024.03.07
[JAVA] 상속★  (1) 2024.03.05
[JAVA] Static  (0) 2024.03.04
[JAVA] 접근 제어자  (0) 2024.03.03
[JAVA] 패키지  (0) 2024.03.02

+ Recent posts