안드로이드 개발자의 창고
[5일차 Java] 배열을 이용한 객체의 생성/오버로딩(Overloading)/가변형 매개변수/상속/다형성 본문
출처 : 안드로이드 앱스쿨 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
![](https://blog.kakaocdn.net/dn/bONRsQ/btsd0S846KL/EMqRplMovXOThJtlRUM5d0/img.png)
다형성
- 형태가 다양하다라는 뜻
- 객체지향에서 다형성의 의미는 생성된 객체의 형태가 다양하다는 의미로 사용한다.
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 값을 담아도 부모 클래스 영역만 사용이 가능하다.
'Computer > Java' 카테고리의 다른 글
[7일차 Java] Static (0) | 2023.05.06 |
---|---|
[6일차 Java] 캡슐화 (0) | 2023.05.05 |
[6일차 Java] 접근 제한자 (2) | 2023.05.05 |
[6일차 Java] 오버라이딩(Overriding) (0) | 2023.05.05 |
[4일차 Java] 객체 생성 및 소멸/가비지 컬렉션(Garbage Collection) (0) | 2023.05.05 |