국비지원 복습과정 6차 (OPP)

Park In Kwon·2022년 9월 6일
0

1. 은닉성

1-1. 은닉성이란?

  • 멤버변수나 메서드가 객체에 노출되지 않도록 설정하는 기법
  • 객체를 사용하는 측의 실수로 인한 기능의 오작동을 방지하기 위해, 클래스의 일부를
    숨기는 처리를 말한다.

1-2. 적용하는 방법

  • 변수의 이름이나 메서드 이름 앞에 "접근 한정자"를 지정한다.

  • public : 모든 곳에서 접근 가능하다.
    일반적으로 모든 메서드 앞에 명시한다.

  • private : 클래스 안에서 사용가능하고, 객체를 통해 접근할 수 없다.
    일반적으로 모든 멤버변수 앞에 명시한다.

  • protected : 현재 클래스 내의 다른 자원이나, 같은 패키지 안에 존재하는 클래스와
    하위 클래스에서 접근 가능하다. 잘 사용하지 않는다.

  • default : 접근 한정자를 명시하지 않은 경우 발생한다. 현재 클래스 내의 다른 자원이나
    동일 패키지 내의 다른 클래스에서 접근 가능하다. 잘 사용하지 않는다.

1-3. getter, setter

  • 멤버변수가 은닉된 형태로 선언된 경우 프로그램의 가장 근본적인 목적인 데이터에 접근
    하는 방법이 사라지므로, 메서드를 통하여 간접적으로 접근하는 방법이 마련되어야 한다.

  • getter, setter 는 은닉된 멤버변수에 간접적으로 접근하기 위하여 정의된 메서들을
    의미하는 용어이다.

  • getter : 은닉된 멤버 변수의 값을 리턴하기 위한 메서드

  • setter : 파라미터로 전달된 값을 멤버 변수에 복사하기 위한 메서드

  • 메서드 작성의 예

    멤버변수 이름 getter setter

    String userName String getUserName ( ) void setUserName( String param )
    int userAge int getUserAge ( ) void setUserAge ( int param )

    -> "get", "set" 접두사 뒤에 변수이름을 첫 글자가 대문자인 형태로 명시
    -> getter 는 연결된 멤버변수의 데이터 타입을 리턴형으로 명시
    -> setter는 연결된 멤버변수의 데이터 타입을 파라미터 형으로 명시

public class Article {
	private int num;
	private String title;
	
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}

1-4. 클래스의 접근 한정자

  • public : 객체 생성이 가능하다.
    서로 다른 소스코드에 정의된 클래스끼리도 객체 생성이 가능하다.

  • private : 클래스에 적용할 수 없다.

  • protected : 클래스에 적용할 수 없다.

  • default : 동일한 소스코드에 정의된 클래스끼리만 객체로 생성가능하다.
    (지금까지 예제 형태)

class User{
	public String name = "자바학생";
	// private가 적용된 항목은 객체를 통하여 접근할 수 없다. (은닉성)
	private int age = 20;
}

public class Main01 {

	public static void main(String[] args) {
		User user = new User();
		// public 이므로 접근 가능
		System.out.println( user.name );
		// pirvate 이므로 age는 접근 불가능
		//System.out.println(user.age);
	}
}

1-5. 클래스의 분리

  • 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에 비효율적이므로,
    기능단위로 소스코드를 분리해야 한다.
  • 소스코드가 분리된 클래스끼리는 public 이 명시되어야만 서로 객체 생성이 가능하다.
  • 일반적으로 클래스 정의에는 public 접근 한정자만 사용한다.
  • 하나의 소스코드에는 하나의 public 클래스만 존재할 수 있다.

1-6. 자바빈즈 (Java Beans)

  • 자바언어에서 사용하는 복합적 데이터 표현의 최소 단위로서, 재사용 가능한 컴포넌트(구성요소)
    를 생성할 수 있다.
  • 자바 빈즈 클래스로서 작동하기 위해서, 객체 클래스는 명명법, 생성법 그리고 행동에 관련된
    일련의 관례를 따라야만 한다. 이러한 관례는 개발도구에서 자바 빈즈와의 연결을 통해
    클래스의 사용과 재사용 그리고 클래스의 재배치를 가능하게 한다.
  • 지켜야할 관례
    -> 클래스는 생성자를 가지고 있어야 한다.
    -> 클래스의 속성들은 get, set 메서드를 통해 접근할 수 있어야 한다.

2. 상속성

2-1. 클래스 간의 상속이란?

  • 클래스간에는 부모 - 자식의 상속 관계를 설정할 수 있다.
  • 부모클래스 A를 자식클래스 B 가 상속받을 때, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속받게 된다.
    (단, private로 설정된 기능은 상속되지 않는다)

2-2. 상속 정의 방법

  • extends 키워드를 사용하여 부모 클래스의 이름을 명시한다.

    public class 자식클래스 estends 부모클래스 {....}

package extendsobject;

public class CalcChild extends CalcParent {
	public int times (int x, int y) {
		return x * y;
	}
	public int divide ( int x, int y ) {
		int result = 0;
		if ( y != 0 ) {
			result = x / y;
		}
		return result;
	}

}

package extendsobject;

public class CalcParent {
	public int plus ( int x, int y ) {
		return x + y;
	}
	public int minus ( int x, int y) {
		return x - y;
	}
	

}

2-3. 클래스 다이어그램을 통한 상속의 표현

  • 클래스의 구조를 표현하는 클래스 다이어그램에서, 상속은 자식 클래스가 부모클래스를 가리키는 화갈표로 표현한다.
  • 상속관계가 이루어 질 때 부모 클래스를 super 클래스 라고 한다.

2-4. 상속을 활용

  • 기존에 존재하는 클래스의 소스 수정 없이 기능을 확장하고자 하는 경우
  • CalcChild 클래스는 CalcParent 클래스를 상속받기 때문에, 별도의 소스코딩 없이도
    puls( ), minus( ) 를 포함하게 된다.
  • ClacChild 클래스에 times ( ), divide ( ) 메서드를 추가하면, 상속받은 메서드에 새로운
    기능을 추가하는 효과를 얻을 수 있다.
  • 여러 개의 클래스에서 공통되는 기능을 추출하여 공유하기
  • 질문/답변 게시물의 한 단위를 표현하기 위한 QNAArticle 클래스와 자료실의 게시물을 표현하기 위한
    FileArticle 은 글 번호와 제목이라는 공통된 특성을 갖는다.
  • Article 클래스는 QNAArticle 클래스와 FileArticle 클래스가 공통적으로 포함하고 있는 멤버변수인
    "글번호(num)", "제목(title)" 과 이 변수들에 대한 getter, setter를 추출한 것이다.
  • 이와 같이 공통 기능을 별도의 클래스로 추출해 내면, 코드의 재사용 및 수정이 용이하다.

3. 오버라이드

3-1. 다형성을 구현하기 위한 Override

  • 육군(Army), 해군(Navy), 공군(AirForce) 은 Unit 이라는 클래스를 통하여 공통 속성을 정의하고 있다.
  • 공통속성: 이름( 멤버변수 및 getter, setter ), 공격 ( attack ( ) 메서드 )
  • 같은 이름이지만 다른 동작을 수행해야 하는 필요성
    -> 모든 군대는 '공격'이라는 공통된 특성을 갖지만 공격하는 방법은 육/해/공군이 서로 다르게 처리되어야 한다.

3-2. 부모 클래스가 가지고 있는 기능을 자식 클래스가 재정의 하는 방법

  • 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우, 부모 클래스의
    기능은 자식에게 가려진다.
  • 이렇게 부모의 기능을 재정의 하는 것을 메서드 Override 라고 한다.
  • 하나의 이름으로 다양한 효과 얻기
    -> 모든 자식클래스가 동일한 이름의 메서드를 갖게 되므로 각 객체에 대하여 attack( ) 이라는 이름을 사용하여
    서로 다른 형태를 구현할 수 있게 된다.
profile
개발자로 진로 변경을 위해 준비하고 있습니다

0개의 댓글