java 15

산야(Sanya)·2024년 1월 17일

java 족보

목록 보기
16/28

1. 상속을 UML로 표시하면?

  • UML(Unified Modeling Language)에서 상속은 화살표로 표현됩니다. 화살표는 부모 클래스에서 자식 클래스로 향하며, 화살표 끝에 비어 있는 삼각형이 있습니다.

2. 부모 클래스와 자식 클래스의 다른 용어들은?

  • 부모 클래스: 상위 클래스 또는 슈퍼 클래스라고도 부릅니다.
  • 자식 클래스: 하위 클래스 또는 서브 클래스라고도 부릅니다.

3. this 키워드와 super 키워드의 차이는 무엇인가요?

  • 'this' 키워드는 현재 객체를 가리키며, 주로 멤버 변수와 메소드의 매개변수 이름이 같을 때 구분하기 위해 사용됩니다.
  • 'super' 키워드는 부모 클래스를 가리키며, 주로 자식 클래스에서 부모 클래스의 메소드나 변수를 호출할 때 사용됩니다.

4. 다음 main() 메소드와 실행 결과를 참고하여 TV를 상속받은 ColorTV 클래스를 작성하라. 다음 TV 클래스가 있다.

class TV{

private int size;

public TV(int size) { this.size = size; }

protected int getSize() { return size; }

}public static void main(String[] args) {

ColorTV myTV = new ColorTV(32, 1024);

myTV.printProperty();

}

/*

===========

32인치 1024컬러

*/
class TV {
    private int size;

    public TV(int size) {
        this.size = size;
    }

    protected int getSize() {
        return size;
    }
}

class ColorTV extends TV {
    private int colors;

    public ColorTV(int size, int colors) {
        super(size);
        this.colors = colors;
    }

    public void printProperty() {
        System.out.println(getSize() + "인치 " + colors + "컬러");
    }
}

public class Main {
    public static void main(String[] args) {
        ColorTV myTV = new ColorTV(32, 1024);
        myTV.printProperty();
    }
}

단일 상속과 다중 상속 이란 무엇인가요? UML 로의 표기는?

  • 단일 상속(Single Inheritance):

단일 상속은 한 클래스가 다른 클래스를 하나만 상속받을 수 있는 상속 방식을 말합니다.
Java와 같은 몇몇 언어에서는 단일 상속만을 지원합니다.
클래스 간의 상속 관계가 간단하고 명확하며 복잡성을 낮추는 장점이 있습니다.

  • 다중 상속(Multiple Inheritance):

다중 상속은 한 클래스가 여러 개의 클래스로부터 상속받을 수 있는 상속 방식을 말합니다.
다중 상속은 여러 개의 부모 클래스로부터 상속받을 때 발생할 수 있는 다양한 문제들로 인해 어려움이 있는 상속 방식입니다.
Java에서는 클래스 간의 다중 상속을 지원하지 않습니다. (인터페이스를 통한 다중 상속 지원)

  • UML 표기:

단일 상속은 클래스 이름과 화살표로 표현됩니다. 화살표는 부모 클래스 쪽으로 향하고, 화살표 끝에 비어 있는 삼각형이 있습니다.
다중 상속은 클래스 이름과 여러 화살표로 표현됩니다. 부모 클래스 쪽으로 향하는 화살표가 여러 개 있습니다.

5. 다음 main() 메소드와 실행 결과를 참고하여 ColorTV를 상속받는 IPTV 클래스를 작성하라.

public static void main(String[] args) {

IPTV iptv = new IPTV("192.1.1.2", 32, 2048); //"192.1.1.2" 주소에 32인치, 2048컬러

iptv.printProperty();

}

=============================================

class IPTV extends ColorTV {
    private String ipAddress;

    public IPTV(String ipAddress, int size, int colors) {
        super(size, colors);
        this.ipAddress = ipAddress;
    }

    @Override
    public void printProperty() {
        System.out.println("나의 IPTV는 " + ipAddress + " 주소의 " + getSize() + "인치 " + getColors() + "컬러");
    }
}

public class Main {
    public static void main(String[] args) {
        IPTV iptv = new IPTV("192.1.1.2", 32, 2048);
        iptv.printProperty();
    }
}

나의 IPTV는 192.1.1.2 주소의 32인치 2048컬러

6. 아래가 에러가 나는 이유는

class Man {
	String name;


	public Man(String name) {
		this.name = name;
	}

	public void tellYourName() {
		System.out.println("My name is " + name);
	}
}

class BusinessMan extends Man {
	String company;
	String position;

	public BusinessMan(String name, String company, String position) {
		this.name = name;
		this.company = company;
		this.position = position;
	}

	public void tellYourInfo() {
		System.out.println("My company is " + company);
		System.out.println("My position is " + position);
		tellYourName();
	}
}

코드에서 BusinessMan 클래스의 생성자에서 this.name = name;와 같은 코드를 통해 직접적으로 부모 클래스인 Man 클래스의 필드인 name에 접근하고 값을 할당하려고 시도하고 있습니다. 이는 부모 클래스의 name 필드가 private으로 선언되어 있어 직접 접근할 수 없기 때문에 에러가 발생합니다.

상속 관계에서 부모 클래스의 private 멤버는 자식 클래스에서 직접 접근할 수 없습니다. 대신에 부모 클래스에서 제공하는 생성자나 메소드를 통해 간접적으로 접근하거나 값을 설정할 수 있습니다.

올바른 방법은 super 키워드를 사용하여 부모 클래스의 생성자를 호출하여 초기화하는 것입니다.

super(name);를 통해 부모 클래스의 생성자를 호출하여 name 필드를 초기화하고, tellYourName() 메소드를 통해 부모 클래스의 메소드를 호출할 수 있습니다.

7.코딩 연습 문제:

  • 2차원 배열 4 * 3 을 선언하고, 각각의 방을 랜덤으로 값을 넣은뒤 모두 출력하시오.
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int[][] array = new int[4][3];
        Random random = new Random();

        // 2차원 배열에 랜덤 값 채우기
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                array[i][j] = random.nextInt(100); // 예시로 0부터 99까지의 랜덤 값
            }
        }

        // 2차원 배열 출력
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }
}
profile
개발일지

0개의 댓글