230327 - java(10)

팝콘·2023년 3월 27일

Java

목록 보기
9/17

1. 상속

  • 기존의 클래스(부모클래스)를 재사용해서 새로운 클래스(자식클래스)를 작성하는 것이다.
  • 상속을 이용하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있다.
  • 새로 작성된 클래스들은 기존 클래스의 코드를 공통으로 가지게 되기 때문에, 공통코드의 관리가 쉬워진다.
  • 클래스는 단일상속만 허용된다. 자식클래스는 두 객체를 동시에 상속할 수 없다.

상속의 장점

  • 부모 클래스의 코드를 재사용할 수 있다.
  • 부모 클리스를 상속 받아서 자식 클래스를 작성하기 때문에 자식 클래스를 빠르게 작성할 수 있다.
  • 공통속성과 공통기능을 유지보수(추가/삭제/변경)가 쉬워진다.
  • 자식 클래스는 고유속성과 고유기능만을 포함하기 때문에 코드가 단순해진다.
// 상위 클래스, 부모 클래스
  public class Parent { ... }

// 하위 클래스, 자식 클래스
  public class Child1 extends Parent { ... }
- 자식 클래스는 extends를 사용해 부모 클래스를 상속한다.

Child c1 = new Child1();
- Child1의 모든 조상객체가 생성된다.
- Parent객체와 Child1객체의 super는 각각 자신의 부모객체를 참조한다.
- c1의 필드 혹은 메서드를 실행하면 먼저 Child1 객체에서 찾는다. 
  없으면 Parent객체에서 찾고, 없으면 모든 클래스의 최고 조상인 Object객체에서 찾는다.
  (무엇을 상속받을지 정하지 않았을 땐 모조건 Object가 부모가 된다.)
  • private과 생성자는 상속할 수 없지만 this 메소드를 사용하면 간접적으로 접근 및 변경할 수 있다.

  • 자식 클래스는 부모 클래스의 모든 멤버를 상속받기 때문에 Child클래스는 Parent클래스의 멤버들을 포함한다고 할 수 있다.(단, 생성자와 초기화 블럭은 상속되지 않는다.)
  • Parent클래스가 변경되면 Child클래스는 영향을 받지만 반대의 경우엔 영향을 받지 않는다.
  • 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어나기 때문에 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.

2. 포함관계

  • 상속 이외에도 클래스를 재사용히는 방법 중 하나로, 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.
class point {
	int x;
    int y;
}

class Circle {
	Point c = new Point();
    int r;
}

상속관계
~은 ~이다. (is - a)
예) 소방차는 차다.

포함관계
~은 ~을 가지고 있다. (has - a)
예) 원은 점을 가지고 있다.


3. super와 super()

super

  • 모든 객체엔 super라는 변수가 존재한다. 상속을 받으면 super에 부모객체의 주소값이 참조된다.

super()

  • super()는 부모객체의 생성자 메서드를 호출한다.
    (this()는 자신의 생성자를 호출한다.)

  • 모든 생성자 메서드는 첫 번째 수행문에 super()가 자동으로 추가된다.
    (단, this() 메서드나 다른 super() 메서드를 호출하는 수행문이 이미 포함되어있는 경우에는 자동으로 추가되지 않는다.)

class Person {
	String id;
	String name;

	// 기본 생성자 메소드
	Person() {
    	// 자동으로 추가된 super() 메서드 
        // 부모객체(Object)의 생성자 메서드를 호출한다.
    	super();	
		}


예)
	class Student extends Person {
		private String major;
		private int grade;

		// 기본 생성자 메서드
		Student(){
			super();
		}
		
        // 매개변수가 있는 생성자 메서드
		Student(String id, String major, int grad, String name) {
			// Person 객체의 Person(Stirng, String)생성자 메소드를 호출한다. 
            // 즉, 부모객체의 생성자 메서드를 호출한다.
            super(id, name);
            // this를 이용해 인스턴스 변수에 지역변수의 값을 저장한다. 
			this.maior = major;
			this.grade = grade;
		}
	}
    
    
객체 생성 후 생성자 메소드 실행순서 확인하기
	Student student = new Student("hong", "컴퓨터공학과", 3 , "홍길동")
    
	Student() {
		super(id, name);	----------------> 1
		this.major = major;	----------------> 5
		this.grade = grade;	----------------> 5
	}

	Person(String id, String name) {
		super();		    ----------------> 2
		this.id = id;	    ----------------> 4
		this.name = name;   ----------------> 4
	}
    
	Object() {
		수행문			--------------------> 3
	}

패키지

  • 클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리다.
  • 모든 클래스는 반드시 하나의 패기지에 포함되어야 한다.
  • 지금까지 소스파일을 작성할 때 패키지를 선언하지 않고도 문제가 없었던 이유는 자바에서 기본적으로 제공하는 이름 없는 패키지 때문이다.
패키지 선언하기
	package 패키지명;

import문

  • import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스 이름에서 패키지명은 생략할 수 있다.
import문 사용x
	java.util.Date today = new java.util.Date();

import문 사용
	import java.util.Date;
    ...
    Date today = new Date();

import문 선언하기
	import 패키지명.클래스명;
    	또는
    import 패키지명.*;

static import문

  • static멤버를 호출할 때 클래스 이름을 생략할 수 있다.
  • static멤버를 자주 사용할 때 편리하고 코드가 간결해진다.
static import문 사용x
	System.out.println(Math.random());
   
static import문 사용
	import static java.lang.Math.random;
    import static java.lang.System.out;
    ...
    out.println(random());
profile
터짐

0개의 댓글