지우너
[정보처리기사 실기] JAVA 본문
java에서 나오는 문제: 객체 지향(상속, 생성자, static 등)
정보처리기사 실기 프로그래밍 파트의 JAVA 상속 정리
해당 부분이 궁금하다면 제목의 링크를 보거나, 유튜브에 흥달쌤 아버지를 검색하면 자세히 알 수 있다.
[Q&A] JAVA | 아버지가 날 낳은 형태
생성자
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");
}
public static void main(String[] args) {
P p1 = new C();
P p2 = new C(1);
P p3 = new C(1, 2);
}
}
정답
A
C
A
D
B
E
1. P p1 = new C();
C(){
// P(); // 기본적으로 매개변수 없는 부모 생성자 호출
System.out.println("C");
}
A
C
P()가 먼저 호출 된 후 C가 출력된다. P()에서 A를 출력하기 때문에 A \n C가 출력된다.
2. P p2 = new C(1);
C(int a){
// P(); // 생략시 부모의 매개변수 없는 생성자 호출
System.out.println("D");
}
A
D
P()가 먼저 호출 된 후 D가 출력된다. P()에서 A를 출력하기 때문에 A \n D가 출력된다.
3. P p3 = new C(1, 2);
C(int a, int b){
super(a);
System.out.println("E");
}
B
E
super(a); 라고 부모의 매개변수가 1개인 생성자를 명시적으로 호출해줬다. P(1);이 호출되고(a=1이니까), 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");
}
public static void main(String[] args) {
P p1 = new C();
p1.func1();
p1.func2();
p1.func3();
}
}
정답
p1.func3()이 에러가 난다.
p1.func1();
아버지가 나를 낳은 형태(부모 p = new 자식()의 형태)에서 오버라이딩이 되었을 경우 자식의 함수를 호출 C
p1.func2();
자식이 오버라이딩 하지 않았으므로 부모의 func2 함수 호출 B
p1.func3();
P p1 = new C(); p1은 자식을 생성했지만 형태는 P 즉, 부모의 형태이다. 이러면 부모가 가진 함수만 호출이 가능하다. func3의 경우 자식에는 있지만, 부모에는 해당 함수가 없다. 따라서 오류가 발생한다.
하이딩
class P{
public static void func1(){
System.out.println("A");
}
}
class C extends P{
public static void func1(){
System.out.println("C");
}
public static void main(String[] args) {
P p1 = new C();
p1.func1();
C p2 = new C();
p2.func1();
}
}
정답
A
C
P와 C의 함수들을 보면 static 키워드가 들어가 있다. 하이딩은 오버라이딩이 아니다. static이 붙으면 오버라이딩이 아니라 각각 가지고 있는 함수가 됨.
1. P p1 = new C(); p1.func1();
P1은 P형태이다. 함수에 static 키워드가 붙어 있기 때문에 부모의 함수를 그대로 출력해야 한다. A 출력
2. C p2 = new C(); p2.func1();
p2는 C의 형태이다. 함수에 static 키워드가 붙어 있으므로 C의 static 함수를 출력한다. C 출력
멤버변수
class P{
public int a =10;
public void func1(){
System.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);
}
public static void main(String[] args) {
P p1 = new C();
p1.a=20;
p1.func1();
p1.func2();
}
}
정답
10
20
1. P p1 = new C();
p1은 부모의 a=10, 자식의 a=10 이렇게 가지게 된다.
2. p1.a=20;
p1은 P의 형태이기 때문에 p1.a=20이라고 하면 부모의 a가 20으로 바뀐다.
3. p1.func1();
func1()은 오버라이딩된 함수이기 때문에 자식의 func1을 실행하게 된다. 자식의 func1에서 변수 a를 출력하게 되는데, 자식의 func1에서 가까운 것은 자식의 변수이다. 따라서 자식의 a인 10을 출력한다.
4. p1.func2();
func2()는 부모에만 있는 함수이다. 따라서 부모의 함수를 실행한다. 부모의 func2에서 변수 a를 출력한다. func2와 가까운 것은 부모의 변수 a이다. 따라서 부모의 변수 a에 저장된 20을 출력한다.
[Q&A] JAVA | 아버지가 날 낳았을때, 변수의 유효범위
class A{
int a = 10;
public A(){
System.out.print("가");
}
public A(int x) {
System.out.print("나");
}
public static void main(String[] args) {
B b1 = new B();
A b2 = new B(1);
System.out.print(b1.a+b2.a);
}
}
class B extends A{
int a =20;
public B() {
System.out.print("다");
}
public B(int x) {
System.out.print("라");
}
}
정답: 가다가라30
Point. super(x)이런 식으로 직접 호출된 게 아니라면 기본적으로 super()을 호출.
1. B b1 = new B() // B클래스의 매개변수 없는 생성자 호출
public B() {
//A(); // 부모생성자 먼저 호출
System.out.print("다");
}
가다
(이때 b1의 부모도 같이 생성되기 때문에 부모.a=10 자식.a=20의 값을 갖게 됨)
2. A b2 = new B(1) // B클래스의 매개변수가 하나인 생성자 호출
public B(int x) {
//A(); // 부모생성자 먼저 호출
System.out.print("라");
}
가라
(이때 b2의 부모도 같이 생성되기 때문에 부모.a=10 자식.a=20의 값을 갖게 됨)
3. System.out.print(b1.a+b2.a);
b1은 B로 생성됨 B b1 = new B(); 따라서 b1.a는 b1의 B의 a인 20이 된다.
b2는 A로 생성됨 A b2 = new B(1); 따라서 b2.a는 b2의 A의 a인 10이 된다.
그러므로, b1.a+b2.a=20+10=30
30이 출력된다.
종합적으로 "가다가라30"이 출력되게 된다.
class Foo{
public int a =3;
public void addValue(int i){
a = a+i;
System.out.println("Foo: " + a + " ");
}
public void addFive(){
a+=5;
System.out.println("Foo: " + a + " ");
}
}
class Bar extends Foo{
public int a =8;
public void addValue(double i) {
a=a+(int)i;
System.out.println("Bar: " + a + " ");
}
public void addFive(){
a+=5;
System.out.println("Bar: " + a + " ");
}
public static void main(String[] args) {
Foo f = new Bar();
f.addValue(1);
f.addFive();
}
}
정답
Foo: 4
Bar: 13
1. Foo f = new Bar();
Foo 형태로 Bar 생성. f는 Foo.a=3, Bar.a=8을 모두 가짐.
2. f.addValue(1);
addValue(1)은 매개변수가 정수인 함수이므로 부모의 addValue(int)가 호출된다.
(* addValue(1)은 부모의 addValue(int i)를 오버라이딩(매개변수가 1개인 addValue함수)한 후, 오버로딩(int→double) 한 함수이다.)
부모의 함수와 가까운 부모의 변수에 매개변수로 들어온 1을 더한다. Foo.a=4
"Foo:" + a를 출력하면 "Foo: 4 " 가 출력된다.
3. f.addFive();
f.addFive()는 자식 클래스에서 오버라이딩한 함수이므로 자식의 addFive()를 호출한다.
자식의 함수와 가까운 자식의 변수 a에 a+=5를 해준다. Bar.a=8+5=13
"Bar: "+ a를 출력하면 "Bar: 13 "가 출력된다.
'Records > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] SQL (0) | 2024.09.29 |
---|---|
[정보처리기사 실기] 파이썬 (0) | 2024.09.27 |
[정보처리기사 실기/계산식] 서브넷 (0) | 2024.09.07 |
[정보처리기사실기] C (0) | 2024.08.14 |
[정보처리기사 실기] 결합도 정리 (0) | 2024.08.01 |