본문 바로가기
언어/JAVA

흥달쌤 영상답변 문제 모음

by 새벽물망초 2022. 10. 14.

메서드 호출

class Account {
	int money=100;
    public void test(int money){
    	System.out.println(this.money+money);
        }
}

public class TestVariable {
	public static void main(String[] args) {
    	Account a = new Account();
        a.test(50);
        }
}
--a 라는 인스턴스--
money = 100 (account 클래스에 있는 변수)


this = 내가 가지고 있는 것

정답 this.money + money = 100 + 50 = 150

 

 

 

생성자

class Parent {
	int age = 43;
    String name = "이홍직";
    
    public Parent() {
    	System.out.println("부모 디폴트 생성자");
        }
    public Parent(int age, String namee) {
    	this.age=age;
        this.name=name;
        System.out.println("부모 인자 있는 생성자");
        }
    pubic void print() {
    	System.out.println(name+", "+age);
        }
}

class Child extends Parent {
	public Child(int age, String name) {
    	System.out.println("자식 생성자");
        }
    
    public static void main(String[] args) {
    	Child a = new Child(13, "이창훈");
        a.print();
        }
}

child 클래스에 a 객체 생성하고 생성자에 인자입력했으니 -> child함수 실행되고 -> 자식 생성자 출력

a 객체에 print 함수 실행하면 43, 이홍직 출력

답 :

자식 생성자

43, 이홍직

인줄 알았으니 하나가 빠졌다.

child 클래스에 a 객체 생성하고 생성자에 인자입력했으니 -> child함수 실행

print하기 전에 보면 이 함수의 클래스는 child가 parent에게 상속받고 있고

이때문에 무조건 부모클래스의 생성자를 호출해야 한다

즉, 상속관계에 있으면 무조건 최상위의 부모의 생성자를 먼저 호출★하여야 한다

정답:

부모 디폴트 생성자

자식 생성자

43, 이홍직

 

 

 

오버로딩, 생성자

class Adder {
	public int add(int a, int b) {
    	return a + b;
        }
    public dobule add(double a, double b) {
    	return a + b;
        }
}

class Computer extends Adder {
	private int x;
    public int calc(int a, int b, int c) {
    	if(a==1) 
        	return add(b,c);
        else 
        	retrn x;
        }
        Computer() { // 생성자
        	x = 0;
        }
}

class test {
	public static void main(String[] args) {
    	Computer c = new Coumputer();
        System.out.println("100+200=" + c.calc(1,100,200);
        System.out.println("5.7+9.8=" + c.add(5.7, 9.8));
        }
}

calc 함수 실행 -> 100, 200 반환

add 함수 실행 ->  15.5 반환

정답 : 

100+200=300

5.7+9.8=15.5

 

*오버로딩

더보기

두 개의 메서드명이 같지만 인자값이 틀린것

*오버라이딩

더보기

상속관계에서, 부모클래스에 있는걸 자식클래스에서 재정의 한것

 

 

 

생성자

class Super {
	Super() {
    	System.out.print("a");
        }
    Super(char x) {
    	System.out.print(x);
        }
        
class Sub extends Super {
	Sub() {
    	super();
        System.out.print("b");
        }
    Sub(char x) {
    	this();
        System.out.print(x);
        }
}

Super s1 = new Super('c');
Super s2 = new Sub('d');

부모 super 에 객체 s1 생성, 생성자 super인자에 c 대입

따라서, c 출력

 

부모 super 에 객체 s2 생성, 생성자 sub 인자에 d 대입

부모가 자식을 낳았다, 부모따라감

자식의 sub함수 실행 전에, 상속관계에선 무조건 최상위 부모의 디폴트생성자를 호출하여야함

라기 보단 sub실행 후 명시적으로 부모를 호출하는지 봐야함

this() 만나고 sub()실행, super()만나고 부모의 디폴트생성자 실행

따라서, a 출력

 

그다음 sub함수로 돌아와서 this래, this는 나 자신을 말함

그리고 d 출력

 

※Super s2 = new Sub('d')

이런 경우는 부모(super) 가 자식(sub)를 낳았기 때문에

일단 자식에 있는 생성자로 가는데, ★자식클래스에서 부모의 생성자를 명시적으로 호출하는지 봐야함

만약 부모의 생성자를 (명시적으로) 호출하지 않으면 묵시적으로 부모의 디폴트 생성자가 호출된다★

  

  Sub(char x) {
     this();
        System.out.print(x);
        }

sub함수보면 this() 를 실행시는데 this는 나를 뜻함, 즉, 내가 가지고 있는 생성자를 다시 호출해야함

그래서 sub() 를 실행함

 

Sub() {
     super();
        System.out.print("b");
        }

sub() 를 실행하고, 부모를 명시적으로 실행하는지 봐야하는데, super()는 부모의 디폴트생성자를 호출하라는 말

따라서 a출력

그다음 다시 sub() 로 돌아와서 b출력

그 다음 sub(d) 로 돌아와서 d출력

 

정답: cabd

 

 

 

문법

public class Conv{
	public Conv(int a){
    	this.a = a;
        }
    int func(){
    	int b = 1;
        for(int i = 1; i<a; i++){
        	b = a * i + b;
            }
            return a + b;
         }
         int a;
 }

public static void main(String[] args){
	Conv obj = new Conv(3);
    obj.a = 5;
    int b = obj.func();
    System.out.print(obj.a + b);
}

conv클래스에 obj 객체를 생성하고 conv에 3을 대입

this.a = a, 현재 지금의 나의 a = 3 즉, conv클래스 내에 int a 가 선언되어 있고, 여기에 3을 대입하겠다는 뜻

결론적으로 obj 객체에 a라는 변수가 있고 거기에 3이 들어가있는 상태.

 

다시 main으로 와서 obj.a = 5 이므로 a=3이었지만 5로 덮어짐,,.즉 a=5가됨

 

i가 1일때 i<5 이면 b =  a*i+b 실행, b = 5*1+1 = 6

i가 2일때 b = 5*2+6 = 16

i가 3일때 b = 5*3+16 = 31

i가 4일때 b = 5*4+31 = 51

i가 5일때 종료

a+b=5+51=56 반환 -> main 함수에서 int b = obj.func() 로 가야함 따라서, b = 56이 됨

 

정답: obj.a+b = 5+56 = 61

 

 

 

생성자

class P{
	P(){
    	System.out.println("a");
        }
    P(int a){
    	System.out.println("b");
        }
}

class C extends P{
	C(){
    	System.out.println("c");
        }
    C(int a){
    	System.out.println("d");
        }
    C(int a,int b){
    	super(a);
        System.out.println("e");
        }
}

P p1 = new C();
P p2 = new C(1);
P p3 = new C(1,2);

P p1 = new C();

p1는 c생성자 가짐, c() 실행하려는데 상속관계이므로 부모를 호출해야함, 명시적으로 부모를 호출한게 없으므로

묵시적으로 부모의 디폴트생성자 호출함

따라서, a 출력 후 c 출력

 

P p2 = new C(1);

p2는 c생성자 가짐, c(1) 실행하려는데 상속관계이므로 부모를 호출해야함, 명시적으로 부모를 호출한게 없으므로
묵시적 부모 디폴트 생성자 호출해서 (자식이 인자를 갖고있는 것과 상관없이, 무조건 디폴트생성자 호출함)

따라서, a 출력 후 d 출력


P p3 = new C(1,2);

p3는 c생성자 가짐, c(1,2)생성하려는데 상속관계이므로 부모를 호출해야하고, 명시적으로 부모를 호출하는 함수 super(a)가 있음, super(a)에 의해 p클래스로 가서 p(a) 실행하면 b출력됨, 다시 c(1,2)로 돌아와서 e출력됨

 

정답: 

a

c

a

d

b

e

 

 

 

오버라이딩

class P{
	public void func1(){
    	System.out.println("a");
        }
    public void func2(){
    	System.out.println("b");
        }

class C extends P{
	public void func1(){
    	System.out.println("c");
        }
    public void func3(){
    	System.out.println("d");
        }
}

P p1 = new C();
p1.func1();
p1.func2();
p1.func3();

먼저 오버라이딩이란 상속관계에서, 부모클래스에 있는걸 자식클래스에서 재정의 한것 이다

즉, 상속관계 시, 부모클래스와 자식클래스에서 각각 메소드명이 같은게 있으면

자식클래스에 있는 메소드를 사용한다

 

P p1 = new C();

상속관계에선 부모의 생성자를 호출하여야 함, 묵시적으로 부모 디폴트 생성자 호추하는데

생성자가 없고 함수밖에 없음 그럼 그냥 스킵?


p1.func1();

func1()을 사용하려는데 부모와 자식에 같은 함수가 둘 다 있다, c클래스가 p에 상속받고 있는 중이므로

자식인 c에 있는 func1()을 사용한다(=메서드 오버라이딩)

따라서 c 출력


p1.func2();

func2() -> b 출력


p1.func3();

-> d출력

이 아니다 !!!

왜냐하면 P p1 = new C() 이므로, 부모가 자식을 낳았으므로 기본적으로 부모기반인 메서드만 사용할 수 있음

즉, 부모의 func1(), func2() 혹은  자식의 func1() 만 사용할 수 있고,

완전히 새롭게 생성된 자식의  func3()은 사용할 수 없다 -> error 발생

 

정답: c

b

error

 

 

 

하이딩

class P{
	public static void func1(){
    	System.out.println("a");
        }

class C extends P{
	public static void func1(){
    	System.out.println("c");
        }
        
P p1 = new C();
p1.func1();
C p2 = new C();
p2.func1();

P p1 = new C();
p1.func1();

부모가 자식을 낳았다, 상속관계 이므로 부모와 자식의 메서드 같으면 자식이 메서드 사용

c 출력

static 이 들어가게 되면, 오버라이딩이아니라 하이딩이 되어서

자식클래스에 있는걸 호출하지 않고 부모가 가지고있는걸 호출하게 됨

따라서 a출력


C p2 = new C();
p2.func1();

자식이 자식을 낳았다, 그런데 c가 상속관계이므로 메서드 오버라이딩

자식이 갖고있는 func1() 사용

c 출력

 

정답: a

c

 

 

멤버변수

class P{
	public int a = 10;
    public void func1(){
    	Systme.out.println(a);
        }
    public void func2(){
    	System.out.println(a);
        }
}

class C extends P {
	public int a = 10;
    public void func1(){
    	System.out.println(a);
        }

P p1 = new C();
p1.a = 20;
p1.func1();
p1.func2();

P p1 = new C();

p클래스에 p1 객체 생성했으므로 부모가 가지고 있는 a임

현재 부모 P 와 자식 C 클래스에 각각 a가 있음

P class 에서 a = 10

C class 에서 a = 10 인 상태.

 

p1.a = 20;

p1 객체에 a = 20 저장하는데, p1은 P클래스에 생성했으므로 P 클래스에 있는 a에 20을 저장함

P class 에서 a = 20

C class 에서 a = 10 인 상태가 됨

 

p1.func1();

c가 p에게 상속받고 있고, 부모와 자식에 각각 메서드명이 같은게 있으므로 메서드 오버라이딩

이는 자식의 메서드를 사용한다는 말이다

따라서 a출력하는데, c클래스에서 a=10 이므로 10 출력함

 

p1.func2();

P class 에서 a = 20

C class 에서 a = 10 인 상태이고

func2()실행하면 20출력

 

정답: 10

20

 

 

 

https://www.youtube.com/watch?v=GS9Cr--ymVE&list=PLniy99c_7ZfqltThMJgw0W-l8w4yn75zL&index=46&ab_channel=%ED%9D%A5%EB%8B%AC%EC%8C%A4 

 

'언어 > JAVA' 카테고리의 다른 글

상속 & 생성자  (0) 2022.10.14
[JAVA] static 변수(정적 변수) + 지역변수, 전역변수  (0) 2022.09.23
변수 자료형  (0) 2022.09.16
[JAVA] 추상 클래스, 추상 메소드  (0) 2022.07.12
[JAVA] 클래스, 상속, 생성자  (0) 2022.07.12

댓글