본문 바로가기

programming/Gukbi

국비 교육 15일차 - 객체지향프로그램

728x90
반응형

오늘은 수업 마지막 시간에 정리를 해주셔서 그냥 수업들으면서 같이 블로깅 할 예정이다.

 

객체지향 프로그램 3대요소

- 캡슐화, 상속, 다형성

 

접근지정어

private < default < protected < public 순으로 접근성이 높다. 

 

(* protected는 상속받은 경우에 접근 가능하게 하는 접근 지정어이다.)

 

캡슐화 : 관련된 데이터와 알고리즘이 하나의 묶음으로 정리되어 있는 것

-> getter, setter를 통해 만들 수 있음 

 

상속 : 이미 작성된 클래스 (부모 클래스)를 이어 받아서 새로운 클래스 (자식 클래스)를 생성하는 방법

기존의 코드를 재활용하기 위한 기법 

다형성 : 하나의 이름으로 많은 상황에 대처하는 기법

개념적으로 동일한 작업을 하는 멤버 함수들에 똑같은 이름을 부여할 수 있으므로 코드가 더 간단해진다 (오버로딩, 오버라이딩)

 

상속의 장점

- 상속을 통하여 기존 클래스의 필드와 메소드를 재사용

- 기존 클래스의 일부 변경도 가능

- 상속을 이용하게 되면 복잡한 GUI 프로그램을 (Window)순식간에 작성

- 상속은 이미 작성된 검증된 소프트웨어를 재사용

- 신뢰성 있는 소프트웨어를 손쉽게 개발, 유지 보수

- 코드의 중복을 줄일 수 있다. 

 

/*
 * 컴파일러가 자동으로 첨부
 * 	1. import java.lang.*;
 * 				  ======== String, System, Math... 등이 자동 첨부 되어 있음
 * 	2. 메소드 => void => 컴파일러가 자동으로 return을 첨부해줌
 * 	3. 모든 클래스는 생성자를 가지고 있다.
 * 	   없는 경우에 디폴트 생성자를 첨부
 * 	4. 모든 클래스 생성
 * 		class A extends Object
 * 				==============
 * 	5. 모든 클래스는 예외처리를 가지고 있다 : 생략할 수 있는 부분...
 */
//Super a, display(), Object 
class Super
{
	protected int a=10;
	//c는 상속이 아니라 공통으로 사용할 수 있게 만든 것
	public static int c=20; // 얘를 호출할때는 원래 반드시 Super.c (클래스 이름을 통해) 접근해야함
	public void display()
	{
		System.out.println("Super: display() Call...");
	}
	public void display2()
	{
	System.out.println("Sub: display() Call...");
	}
	public void display3()
	{
	System.out.println("Sub: display() Call...");
	}
	// 예외
	public Super()
	{
		System.out.println("Super: 생성자함수()...");
	}
}
// Sub => display(), Object
class Sub extends Super
{
	/*
	 * private int a=10;
	
		public void display()
		{
		System.out.println("Super: display() Call...");
		}
	 */
	private int b=10;
	public Sub()
	{
		System.out.println("Sub : 생성자 () Call...");
	}
	
	// 오버라이딩 : 상속후에 변경 (수정하기가 용이함)
	/*
	 * 	오버라이딩의 조건 (재정의) : 메소드의 내용 변경 ==> 수정이 용이 : 기능, 메소드명, 리턴형, 매개변수
	 * 	1) 상속을 받는다
	 * 	2) 메소드명이 동일
	 * 	3) 매개변수가 동일 
	 * 	4) 리턴형이 동일 
	 * 	5) 확장은 가능, 축소는 불가 (접근지정어)
	 * 		private < default < protected < public
	 * 				  =======
	 * 							=========
	 *  6) 블록안의 내용만 바꿔서 처리해줌
	 * 
	 */
	public void display()
	{
	System.out.println("Sub: display() Call...");
	}
	public void display2()
	{
	System.out.println("Sub: display2() Call...");
	}
	
	
}
public class MainClass {

	public static void main(String[] args) {
		Super s=new Sub(); // Sub는 Sub와 Super 데이터형 둘 다 받을 수 있음
		Sub sub=new Sub();
		sub.display();
		
		System.out.println("sub.a="+sub.a);
		sub.a=100;
		System.out.println("sub.a="+sub.a);
		sub.display();
		sub.display2();
		sub.c=100; // 상속을 받아서 sub에서도 사용이 가능함
		
	}

}

상속은 B extends A 이런 형식으로 사용가능하다. 

- 기존의 클래스에 새로운 기능을 추가하는 것이 가능

 

오버로딩

- 같은 클래스 내에서 사용하는 것

- 같은 이름으로 여러개의 다른 메소드들을 만들 수 있음 (단, 매개변수의 수, 매개변수의 타입 등이 달라야함)

 

오버라이딩

- 상속을 받아와야만 사용이 가능하다

- 메소드의 이름, 매개변수 동일, 리턴형이 동일해야한다. 

- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다. 

 

위의 예제 코드를 호출한 결과를 보면 상속이 어떻게 진행되는지 자세히 알 수 있다

 

참조변수 s를 가지고 있는 Sub 인스턴스와

참조변수 sub를 가지고 있는 Sub인스턴스가 먼저 호출됐다. 

 

sub 참조변수를 이용해서 a의 값을 바꿔줄 수 있고, 

display2 메소드는 오버라이딩을 통해 실행기능이 수정된 것을 확인 할 수 있다. 

 

 

상속
  => 기존의 클래스의 모든 기능과 모든 데이터를 받아서 확장하는 클래스를 만든다
  => 상속의 형식
  =======
 

class A
  class B extends A
   ===       ===
   자식        부모
  
  => 자바 상속의 단점 : 단일 상속
  => 재사용 : 있는 그대로 사용-포함클래스
    변경해서 사용-상속
  
  => 사용법
  extends
  
  class A
  class B extends A
  *** 상속을 받는 경우 (기본은 상속내리는 클래스의 모든 것을 받아온다)
  단 예외조건 (static변수, static 메소드, 생성자는 예외)
                   ================================= 상속받은 클래스는 사용이 가능
 private은 상속은 내려가는데 사용은 불가능함 (private 대신 protected 사용)
   
   
 클래스의 크기를 비교 => 상속을 내리는 클래스가 더 크다 (상속)


  동물 
    |
 사람 (사람, 동물)
 

 

클래스간의 관계

1. 포함관계 - 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.

(has-a) "~은 ~을 가지고 있다"

 

2. 상속관계 - (is-a) "~은 ~이다"

상속은 하나의 부모 클래스로부터만 받을 수 있다. (단일 상속)

-> 즉 다중상속은 불가능하다. 

 

 

Object class

Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 함으로써 이것을 가능하게 한다. 

하지만 default이기 때문에 따로 정의하지 않아도 컴파일러가 추시시켜준다. 

 

 

오늘은 여기까지~~

 

 

 

 

728x90
반응형

'programming > Gukbi' 카테고리의 다른 글

국비 교육 17일차 - 상속, 포함  (0) 2021.01.19
국비 교육 16일차  (0) 2021.01.15
국비 교육 14일차 - 생성자  (0) 2021.01.13
국비 교육 13일차 - Class method  (0) 2021.01.12
국비 교육 12일차 - Class 변수  (0) 2021.01.11