반응형

클래스의 관계

일반화 관계(Generalization)

  • 상속관계 (is a 관계)
  • 부모클래스를 상속 받아 자식클래스에서 사용

ex) 사원클래스 / 관리자 클래스
→ 관리자는 사원이다. (O)
→ 사원은 관리자다. (X)

실체화 관계(Realization)

  • 인터페이스를 상속 받아 자식클래스에서 재정의하여 사용
  • 부모클래스의 은닉화 선언된 필드 또는 메소드는 상속되지만 접근은 불가능
  • 부모 인스턴스 생성 후 자식 인스턴스 생성

ex) 도형 인터페이스 >> 원클래스 or 삼각형클래스

연관 관계(Association) 또는 직접 연관 관계(Direct Association)

  • 포함관계 (has a 관계)
  • 클래스 안에 필드를 참조변수로 선언하여 사용 - 인스턴스 정보 저장

ex) Computer << CPU + Mainboard + Memory

집합 연관 관계(Aggregation)

  • UML2.0에서는 연관관계로 표현
  • 포함 관계의 인스턴스와 생명주기 다른 경우

ex) 컴퓨터 << 프린터

복합 연관 관계(Compostion)

  • 포함 관계의 인스턴스와 생명주기 같은 경우

ex) 게임 << 캐릭터

의존 관계(Dependency)

  • 메소드의 파라메터로 선언되어 사용되는 참조변수
  • 일시적으로 메소드에서 인스턴스를 사용할 경우

ex) TV << 리모콘


※ ObjectAid 설치(이클립스의 확장 프로그램) ↓↓
https://www.objectaid.com

상속(Inheritance)

: 클래스를 물려받아 사용하는 기능

★상속을 사용하는 이유★

  • 기존 클래스를 활용하여 보다 빠르게 새로운 클래스 작성 : 프로그램의 생산성 증가

ex) 자료실 → 게시판(상속) + 파일처리

  • 공통적인 속성과 기능을 정의한 클래스를 생성하여 상속 받아 사용 : 유지보수 효율성 증가

ex) 사람 >> 학생,강사,직원

  • 물려주는 클래스 : 부모클래스, 선조클래스, 슈퍼클래스, 기본클래스
  • 물려받는 클래스 : 자식클래스, 후손클래스, 서브클래스, 파생클래스
  • 부모클래스의 생성자는 자식클래스에게 상속 불가능
  • 부모클래스의 은닉화 선언된 필드 또는 메소드는 상속 되지만 접근 불가능
  • 상속 방법 : 단일 상속 >> 부모클래스가 하나만 존재

public class 자식클래스 extends 부모클래스 { //부모클래스의 필드 및 메소드 사용 가능 }

  • 자식클래스로 인스턴스를 생성할 경우 자식클래스의 생성자가 실행되기 전에 부모클래스 생성자가 먼저 실행

→ 부모 인스턴스 생성 후 자식 인스턴스 생성

super 키워드

: 자식클래스의 메소드에서 부모 인스턴스를 표현할 때 사용하는 키워드

  • 자식클래스의 메소드에서 부모 인스턴스의 필드 또는 메소드에 접근하기 위해 사용
  • 자식클래스의 필드 또는 메소드가 아닌 경우 자동으로 부모클래스의 필드 또는 메소드 사용 : super 생략 가능

★super 키워드를 사용하는 경우★

  1. 자식클래스의 생성자에서 부모클래스 생성자를 호출하기 위해 사용
  • 자식클래스의 생성자가 호출되기 전에 super 키워드에 의해 부모클래스의 생성자가 먼저 호출
  • super 키워드로 생성자 호출하는 명령은 생성자에서 최초의 명령으로 반드시 작성
  • super 키워드로 부모클래스의 생성자 호출이 생략된 경우 기본 생성자 호출

형식) super(값, ...);

  1. 오버라이드 선언되어 숨겨진 부모클래스의 메소드에 직접 접근해야 할 경우 사용

형식) super.메소드명(값, ...);

메소드 오버라이드(Method Override)

  • 부모클래스의 메소드를 자식클래스에서 재선언 하는 기능
  • 부모클래스의 메소드는 숨겨지고 자식클래스의 메소드만 사용
  • 상속관계에서만 구현 가능
  • 부모클래스의 메소드의 머릿부를 동일하게 선언
  • 접근지정자, 반환형, 메소드명, 파라메터, 예외전달이 반드시 동일

@override : 오버라이드 선언 메소드를 표현하기 위한 어노테이션 (Annotation)
→ 오버라이드 선언 규칙을 지키지 않을 경우 에러 발생

★상속 관계에서 참조변수(레퍼런스변수)와 인스턴스의 사용법★

⑴ 부모클래스 참조변수 = new 부모클래스(); [가능]
→ 참조변수는 부모클래스 요소에 접근 가능

⑵ 자식클래스 참조변수 = new 자식클래스(); [가능]
→ 참조변수는 자식클래스의 요소 및 부모클래스의 요소에 접근 가능
→ 부모인스턴스와 자식인스턴스를 생성하여 자식인스턴스를 참조변수에 저장

⑶ 자식클래스 참조변수 = new 부모클래스(); [불가능]
→ 자식인스턴스가 존재하지 않아 참조변수에 저장할 경우 에러 발생

★ ⑷ 부모클래스 참조변수 = new 자식클래스(); [가능]
→ 참조변수는 기본적으로 부모클래스의 요소에 접근 가능
→ 객체 형변환을 이용하면 자식클래스의 요소에 접근 가능
→ 부모인스턴스와 자식인스턴스를 생성하여 부모인스턴스를 참조변수에 저장

★객체형변환★

객체형변화 : 상속관계의 클래스에서 구현

⑴ 명시적 형변환 (강제형변환)

  • cast 연산자 이용
  • (자식클래스명 )참조변수 → 참조변수의 자료형을 상속관계의 자식클래스로 잠시 변환

((MemberEvent)member4).setEmail("aaa@google.com");
→ 자식인스턴스로 변경하여 저장 (자식클래스 접근 가능)

⑵ 묵시적 형변환(자동형변환)

  • 메소드 오버라이딩을 이용

<메소드 오버라이드에 의한 다형성>

☞ 부모참조변수에 저장된 자식인스턴스에 따라 자식인스턴스의 메소드 호출
☞ 부모참조변수에 저장된 자식인스턴스를 JVM이 자동으로 구분하여 처리

★instanceof 연산자★

  • 부모참조변수로 객체 형변환 가능한 자식인스턴스을 구분하기 위한 연산자

형식) 참조변수 instanceof 자식클래스
→ 참조변수가 자식클래스로 객체 형변환 가능한 경우 true 제공

★java.lang.Objetc 클래스★

  • 모든 클래스가 반드시 상속 받는 최선조클래스
    • 모든 인스턴스는 Object 클래스의 메소드 사용 가능
  • 클래스를 선언할 때 상속받는 클래스가 없을 경우 자동으로 Object 클래스 상속
  • 참조변수의 인스턴스 정보를 출력하면 Object 클래스의 toString() 메소드 자동 호출
    •  
    • Object 클래스의 toString() 메소드를 오버라이드 선언하여 사용

final 키워드

⑴ final 필드

형식) 접근지정자 final 자료형 필드명 = 값;

  • 필드값 변경 불가능

※ final 필드명은 모두 대문자로 작성하며 단어 구분자로 _ 사용
※ 상수필드(Constant Field) : 상수 대신 사용하기 위한 고유명칭

public static final 필드명 = 값;


ex) java.lang.Math 클래스 - public static final double PI
→ API 문서에서 Constant Field Values 에서 저장된 값 확인

⑵ final 메소드

접근지정자 final 반환형 메소드명(파라메터,...) {	
	명령;	
	...
}

→ 메소드 오버라이드 선언 불가능
ex) java.lang.Object 클래스 - public final void notify() 메소드

⑶ final 클래스

접근지정자 final class 클래스명 { }
  • 상속 불가능 → 부모클래스로 사용 불가능

ex) java.lang.System 클래스 - public final class System extends Object

반응형

추상클래스(Abstract Class)

  • 추상클래스는 인스턴스 생성 불가능 → 상속 목적의 클래스

형식) 접근지정자 abstract class 클래스명 { }

  • 추상메소드를 1개라도 가지고 있으면 반드시 추상클래스 선언

추상메소드(Abstract Method)

추상메소드 : 영역이 없는 불완전한 메소드 (명령 미존재)
형식) 접근지정자 abstract 반환명 메소드명(파라메터,...);

  • 추상메소드가 존재하는 추상클래스를 상속받은 자식클래스는 모든 추상메소드를 반드시 오버라이드 선언
    • 추상메소드를 오버라이드 선언하지 않을 경우 자식클래스도 추상클래스로 작성
★추상메소드를 만드는 이유★
자식클래스에서 반드시 선언해야 되는 메소드와 작성규칙 제공 : 작업명세서
추상클래스(부모)로 참조변수를 만들어 자식인스턴스의 정보 저장 (객체 형변환 이용)



패키지(package)

패키지(pachage) : 디렉토리(폴더)와 동일 → 파일을 구분하여 저장하기 위해 사용

  • 같은 기능의 참조형을 그룹화 하기 위해 패키지 사용


※ 참조형 : 개발자가 선언할 수 있는 자료형 → class, interface, enum

  • 참조형에 대한 소스파일 처음에 패키지 선언
    • 형식) package 패키지명;
    • → 패키지에 참조형이 선언 되었음을 표현
  • 패키지명은 도메인(Domain)을 역방향으로 나열하여 작성하는 것을 권장
    • ※ 도메인 : 인터넷에서 개인 또는 그룹이 사용할 수 있는 주소(고유값)
  • 패키지 마지막에는 작업그룹명을 작성하는 것을 권장

import

  • 참조형을 사용하기 위해서는 패키지명을 포함한 참조형으로 표현
    • 패키지에 같은 경우 패키지명을 미포함하여 표현 가능
  • 패키지명을 포함한 참조형을 import 처리하면 패키지명을 미포함하여 표현
    • 형식) import 패키지명.참조형;
    • package 명령 아래 및 참조형 선언 위에 작성
  • 이클립스에서는 참조형을 자동 완성한 경우 자동 import 처리
    • 형식) import 패키지명.*;
    • 패키지에 존재하는 모든 참조형 import 처리
  • java.lang 패키지는 자동으로 import 처리되어 있으므로 java.lang 패키지의 참조형은 사용 가능
  • 같은 이름의 참조형이 존재하므로 import 처리 주의


※ import를 정리하는 단축키 : Ctrl+Shift+O
→ 필요한 참조형을 import 처리하거나 불필요한 참조형의 import 처리 제거

지정자(Modifier) : 접근의 유무 제어

  • 접근지정자 ☞ private , public , protected , package
  • 클래스지정자 ☞ static
  • 추상지정자 ☞ abstract
  • 파이널지정자 ☞ final

접근지정자(Access Modifier)

접근지정자(Access Modifier) : 참조형의 구성요소에 접근 유무 제어

⑴ private : 참조형의 구성요소를 숨겨 접근 불가능 (은닉화)

  • 가장 제한적인 접근지정자
  • 참조형 내부에서만 접근 가능하며 외부에서는 접근 불가능
  • 필드에 잘못된 정보가 저장되는 것을 방지하기 위해 사용 → Getter & Setter(캡슐화)

※ 생성자 또는 메소드를 private 선언 가능


⑵ public

  • 무조건 접근 가능한 접근지정자
  • 참조형 내부 및 동일 패키지 또는 다른 패키지의 참조형 어디서나 접근 가능
  • 생성자 또는 메소드를 public 선언 >> 상수필드(Constant Field) 선언
참조형을 선언할 때 public 키워드를 붙이는 이유??
다른 패키지의 참조형에서 접근 가능하도록 선언
참조형에 public 키워드가 없는 경우 다른 패키지에서 접근 불가능


※ 소스파일에는 public 키워드가 선언된 참조형 하나만 선언 가능
→ 소스파일명은 반드시 public 키워드가 선언된 참조형의 이름으로 저장


⑶ package(default)

  • 접근지정자 관련 키워드를 사용하지 않고 선언한 경우
  • 참조형 내부 및 동일 패키지의 참조형에서는 접근 가능
  • 다른 패키지의 참조형에서는 접근 불가능


⑷ protected

  • 참조형 내부 및 동일 패키지의 참조형에서는 접근 가능
  • 다른 패키지의 참조형에서는 접근 불가능

but 다른 패키지의 클래스에서 상속 받은 경우에는 접근 가능


인터페이스(Interface)

인터페이스(Interface) : 상수필드(Constant Field) + 추상메소드(Abstract Method)

JDK 1.8이상에서는 기본메소드(Default Method)와 정적메소드(Static Method) 선언 가능

public interface 인터페이스명 { 
	자료형 변수명=값; //public static final 생략 
	... 
	반환형 메소드명(매개변수,...); //public abstract 생략 
	...
}

  • 인터페이스를 이용하여 인스턴스 생성 불가 → 생성자가 선언되어 있지 않기 때문
  • 인터페이스는 클래스가 상속받아 사용 → 클래스의 부모 역할 수행
  • 클래스에서 인터페이스를 상속받는 방법 → 다중상속 가능
public class 클래스명 implements 인터페이스명,인터페이스명,... {
}

※ 클래스는 단일상속만 가능하지만 인터페이스 다중상속 가능

  • 인터페이스를 상속받은 클래스는 반드시 인터페이스의 모든 추상메소드를 오버라이드 선언 (실체화 작업)
  • 인터페이스를 이용하여 참조변수를 생성하고 자식인스턴스 정보를 저장하여 객체 형변환으로 접근 가능
  • 인터페이스는 기존 인터페이스 상속 가능 (다중상속 가능)
public interface 인터페이스명 extends 인터페이스명,... {
}


★인터페이스 존재 이유★

  • Java 프로그램 작성시 단일상속의 문제점을 보완하기 위해 인터페이스 사용
    • 클래스의 단일상속 문제로 프로그램 작성의 어려움 발생

예를 들어서,
public class 늑대인간 extends 인간,늑대 [불가능]
public class 늑대인간 extends 인간 implements 늑대 [가능]
public class 흡혈늑대인간 extends 인간 implements 늑대,흡혈귀 [가능]

  • 작업명세서의 역할
    • 인터페이스를 상속받은 모든 자식클래스에 동일한 메소드 작성 규칙을 제공받아 작성
    • 클래스 간의 결합도를 낮춰 시스템 변경에 대한 프로그램 유지보수의 효율성 증가

나열형(Enum)

: 상수필드(Constant Field)

public enum 나열명 { //나열형 상수(Enum Constant) - 필드값 생략 가능 
	필드명,필드명,...; //public static final int 생략
}
  • 나열형 상수에는 내부적으로 0부터 1씩 증가되는 정수상수 자동 저장
  • 나열형 상수에 다른 자료형을 선언하거나 원하는 상수를 저장하고 할 경우 필드와 생성자 선언
    • 필드와 생성자는 반드시 private 접근지정자로 선언
    • 나열형 상수 설정시 반드시 생성자로 상수를 전달하여 저장
  • 생성자 선언할 때 매개변수에 값을 전달받아 상수필드에 초기값 저장
    • 생성자 선언한 경우 상수필드에 초기값을 전달해야만 상수필드 생성

ex) 필드명(초기값), 필드명(초기값), ... ;

  • 상수필드값을 확인하기 위한 getter 메소드 선언
  • 인터페이스의 상수필드에서 고유값으로 표현되지 않는 문제점을 해결하기 위해 사용
반응형

+ Recent posts