메서드 호출
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
'언어 > 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 |
댓글