Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[5일차 Java] 배열을 이용한 객체의 생성/오버로딩(Overloading)/가변형 매개변수/상속/다형성 본문

Computer/Java

[5일차 Java] 배열을 이용한 객체의 생성/오버로딩(Overloading)/가변형 매개변수/상속/다형성

Wise-99 2023. 5. 5. 20:15

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

향상된 for문

  • 향상된 for문은 값을 가져다가 사용할 때만 사용하는 것이 좋다.
int[] number = {1, 2, 3, 4, 5};

// 일반 for문
for(int i=0; i<10; i++){
    System.out.println(number[i]);
}

// 향상된 for문
for(int num : number) {
    System.out.println(num);
}
 
 

배열을 이용한 객체의 생성

  • 향상된 for문을 이용하여 객체를 생성하면 NullPointerException이 발생한다.
  • 향상된 for문에 사용되는 변수는 값을 가져오는 것이지 저장하는 것으로 사용할 수 없다.
  • 객체의 ID 값을 배열에 저장해야 하지만 for문 상단으로 다시 올라감과 동시에 다시 Null로 되돌아간다.
  • 인덱스를 활용한 for문은 값을 넣을 수 있기에 일반 for문을 사용해야 한다.
// Student 클래스를 이용한 배열 생성
Student[] studentArray = new Student[10];

// 일반 for문을 이용한 객체 생성
for(int i=0; i<10; i++) {
    studentArray[i] = new Student();
}

// 향상된 for문을 이용한 객체 생성(오류 발생)
for(Student s : studentArray) { // s는 Null 값을 가져와 Student 객체를 넣고 다시 초기화됨
    s = new Student();
}
 
 

오버로딩(Overloading)

  • 메서드나 생성자를 작성할 때 매개변수의 형태를 다르게 하여 같은 이름으로 여러 개를 만들 수 있도록 제공되는 개념
  • 생성자에서 다른 생성자를 호출할 때 this()를 사용하며, this()는 생성자 내에서 첫번째 코드여야 한다.
  • 메서드도 이름을 동일하게 하고 매개변수의 형태를 다르게 하여 메서드를 여러 개 만들 수 있다.
public class MainClass {
	public static void main(String[] args) {
		
		TestClass1 t1 = new TestClass1();
		TestClass1 t2 = new TestClass1(1);
		TestClass1 t3 = new TestClass1(1, 2);
		
		t1.printMember(); // 100, 200
		t2.printMember(); // 1, 200
		t3.printMember(); // 1, 2
		
		int r1 = t1.add(100, 200);
		long r2 = t1.add(100L, 100L);
		double r3 = t1.add(11.11, 22.22);
		
		System.out.printf("r1 : %d\n", r1); // 300
        System.out.printf("r2 : %d\n", r2); // 200
        System.out.printf("r3 : %f\n", r3); // 33.33
	}
}

class TestClass1 {
	int memberA;
	int memberB;
	
	public TestClass1() {
		this(100, 200);
		// this.memberA = 100;
		// this.memberB = 200;
	}
	
	public TestClass1(int memberA) {
		this(memberA, 200);
		// this.memberA = memberA;
		// this.memberB = 200;
	}
	
	public TestClass1(int memberA, int memberB) {
		this.memberA = memberA;
		this.memberB = memberB;
	}
	
	public void printMember() {
		System.out.printf("memberA : %d\n", memberA);
        System.out.printf("memberB : %d\n", memberB);
	}
	
	public int add(int a1, int a2) {
		return a1 + a2;
	}
	
	public long add(long a1, long a2) {
        return a1 + a2;
    }
    
    public double add(double a1, double a2) {
        return a1 + a2;
    }
}
 
 

가변형 매개변수

  • 타입이 같은 매개변수를 가지고 있는 메서드를 무한정 만들 수 없기 때문에 제공되는 개념
  • 매개변수를 작성할 때 ... 을 붙여주면 전달되는 값들을 배열로 만들어 사용할 수 있다.
public int add2(int ... a1) {
    int total = 0;
    for(int value : a1) {
    		total = total + value;
    }
    return total;
}
 
 

상속

  • 다른 클래스의 멤버 변수나 멤버 메서드를 자기 것처럼 물려받아 사용하는 개념
  • 상속을 받는 쪽을 자식 클래스(Sub Class)라고 부르고 상속해주는 쪽을 부모 클래스(Super Class) 라고 부른다.
  • 자바의 모든 클래스는 제한을 두지 않으면 부모 클래스가 될 수 있다.
  • 자식 클래스의 객체를 생성하면 부모 클래스의 객체도 같이 생성된다.
  • 자식클래스는 부모 클래스의 요소를 자기 것인 것처럼 사용할 수 있다.
public class MainClass {

	public static void main(String[] args) {
		
		SubClass sub1 = new SubClass();
		sub1.subMethod();
	}
}

// 부모 클래스
class SuperClass{
	int memberC = 300;
	int memberD = 400;
	
	public void superMethod() {
		System.out.println("SuperClass의 superMethod 호출");
	}
}

// SuperClass를 상속 받는다.
class SubClass extends SuperClass {
	int memberA = 100;
	int memberB = 200;
	
	public void subMethod() {
		System.out.printf("memberA : %d\n", memberA); // 100
        System.out.printf("memberB : %d\n", memberB); // 200
        System.out.printf("memberC : %d\n", memberC); // 300
        System.out.printf("memberD : %d\n", memberD); // 400
        subMethod2();                                 // SubClass의 subMethod2 호출
        superMethod();                                // SuperClass의 superMethod 호출
    }
    
    public void subMethod2() {
        System.out.println("SubClass의 subMethod2 호출");
    }
}
 
 

상속에서의 생성자

  • 클래스의 객체를 생성하면 생성자가 자동으로 호출된다.
  • 이 때 생성자에서 부모 클래스의 생성자를 자동으로 호출해준다.
  • 자동으로 호출되는 생성자는 매개변수가 없는 생성자이다.
  • 만약 매개변수가 있는 생성자를 선택해 객체를 생성한다고 하더라도 부모의 생성자 호출을 명시하지 않으면 부모의 생성자 중 매개변수가 없는 기본 생성자가 호출된다.
  • 만약 부모의 생성자를 선택하고 싶다면 super()를 사용한다.
public class MainClass {

	public static void main(String[] args) {
		
		SubClass2 sub2 = new SubClass2();
		System.out.printf("sub2 : %s\n", sub2);
		
		SubClass2 sub3 = new SubClass2(100);
		System.out.printf("sub3 : %s\n", sub3);
	}

}

class SuperClass2{
	
	public SuperClass2() {
		System.out.println("SuperClass2의 기본 생성자");
	}
	
	public SuperClass2(int a1) {
		System.out.printf("SuperClass2의 매개변수가 하나 있는 생성자 : %d\n", a1);
	}
}

class SubClass2 extends SuperClass2{
	
    public SubClass2() {
        System.out.println("SubClass2의 기본 생성자");
    }
    
    public SubClass2(int a1) {
    	super(a1);
    	System.out.printf("SubClass2의 매개변수 하나 있는 생성자 : %d\n", a1);
    }
}
 

Console

 

다형성

  • 형태가 다양하다라는 뜻
  • 객체지향에서 다형성의 의미는 생성된 객체의 형태가 다양하다는 의미로 사용한다.
public class MainClass {

	public static void main(String[] args) {
		
		TestClass1 t1 = new TestClass1();
		
		// TestClass1을 통해 만든 객체를 TestClass2 타입의 변수에 담는다.
		// 객체를 생성했을 때 사용했던 클래스 타입의 변수에 객체의 ID를 담을 수 있다.
		// 따라서 다른 클래스 타입의 변수에 객체의 ID를 받는 건 오류이다.
		TestClass2 t2 = t1; <<< 오류
		
		// 생성된 객체의 ID를 부모 클래스형 변수에 담는 것은 가능하다.
		TestClass4 t4 = new TestClass4();
		TestClass3 t3 = t4;
		System.out.printf("t4 : %s\n", t4); // t4의 ID
		System.out.printf("t3 : %s\n", t3); // t4의 ID, 같은 ID 출력됨
		
		// 객체를 생성했을 때 사용했던 클래스 타입의 변수를 이용해 멤버 사용
		// 부모의 것도 모두 사용 가능하다.
		System.out.printf("t4.memberA : %d\n", t4.memberA); // 100
		System.out.printf("t4.memberB : %d\n", t4.memberB); // 200
		System.out.printf("t4.memberC : %d\n", t4.memberC); // 300
		System.out.printf("t4.memberD : %d\n", t4.memberD); // 400
		
		// 부모 클래스 타입의 변수를 이용해 멤버 사용
		System.out.printf("t3.memberA : %d\n", t3.memberA); // 100
		System.out.printf("t3.memberB : %d\n", t3.memberB); // 200
		
		// TestClass4를 가지고 객체를 생성했다고 하더라도 변수가 부모 클래스 타입의 변수이기 때문에
		// 부모 클래스 영역만 접근할 수 있다.
		System.out.printf("t3.memberC : %d\n", t3.memberC); <<< 오류
		System.out.printf("t3.memberD : %d\n", t3.memberD); <<< 오류
	}

}

class TestClass1 {
	
}

class TestClass2 {
	
}

class TestClass3 {
	int memberA = 100;
	int memberB = 200;
}

class TestClass4 extends TestClass3 {
	int memberC = 300;
    int memberD = 400;
}
 
 

알게된 점 & 깨달은 점

  • 향상된 for문의 내부 변수는 값을 가져와 이용(계산 등등)할 때 사용하는 것이 좋다.
  • 부모 클래스 변수는 자식 객체 ID 값을 담아도 부모 클래스 영역만 사용이 가능하다.