풀스택 과정 day09_Java

정유섭·2022년 3월 17일
0

22.3.17.(목)

클래스, 객체, 인스턴스

JavaBeans(자바빈즈)

상속


1. 클래스, 객체, 인스턴스

1-1. 클래스(Class)

- 객체를 만들어내기 위한 설계도 혹은 틀

- 연관되어 있는 변수와 메서드의 집합

1-2. 객체(Object)

- 소프트웨어 세계에 구현할 대상

- 클래스에 선언된 모양 그대로 생성된 실체

- '클래스의 인스턴스(Instance)' 라고도 부른다.

- 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.

- OOP(Object-Oriented Programming)의 관점에서 클래스의 타입으로 선언되었을 때
  '객체'라고 부른다. -> 객체지향

1-3. 인스턴스(Instance)

- 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체

- 즉, 객체를 소프트웨어에 실체화 하면 그것을 '인스턴스'라고 부른다.

- 실체화된 인스턴스는 메모리에 할당된다.

- 인스턴스는 객체에 포함된다고 볼 수 있다.

- OOP의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.
class Animal {
	...
}

public class Main {
	public static void main( String[] args ) {
		Animal cat, dog;	// 객체

		// 인스턴스화
		cat = new Animal( );	// cat은 Animal 클래스의 '인스턴스'
					// 객체를 메모리에 할당
		dog = new Animal( );		
	}		
}

1-4. 클래스, 객체, 인스턴스 차이

- 클래스 vs 객체

	-> 클래스는 "설계도", 객체는 "설계도로 구현한 모든 대상"을 의미한다.

- 객체 vs 인스턴스

	-> 클래스의 타입으로 선언되었을 때 객체라고 부르고,
   	   그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.

	-> 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.

	-> 객체를 '클래스의 인스턴스' 라고도 부른다.

	-> 엄격하게 객체와 인스턴스를 나누긴 어렵다.

2. 은닉성

2-1. 클래스와 접근 한정자

- 클래스에 접근 한정자를 지정한 경우
접근 한정자							설명
public							객체 생성이 가능하다.
				서로 다른 소스코드에 정의된 클래스끼리도 객체 생성이 가능하다.		
private						클래스에 적용할 수 없다.
protected					클래스에 적용할 수 없다.
default			동일한 소스코드에 정의된 클래스끼리만 객체로 생성 가능하다.
							(지금까지의 예제 형태)
- 클래스의 분리

	-> 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에
       비효율적이므로, 기능단위로 소스코드를 분리해야 한다.

	-> 소스코드가 분리된 클래스끼리는 public이 명시되어야만 서로 객체 생성이 가능하다.

	-> 일반적으로 클래스 정의에는 public 접근 한정자만 사용한다.

	-> 하나의 소스코드에는 하나의 public 클래스만 존재할 수 있다.
    


< getter, setter를 통해 은닉변수를 할당, 출력할 수 있다! >

2-2. 자바빈즈(JavaBeans)

- 자바 언어에서 사용하는 복합적인 데이터 표현의 최소 단위로서,
  재사용 가능한 컴포넌트(구성요소)를 생성할 수 있다.

- 자바빈즈 클래스로서 작동하기 위해, 객체 클래스는 명명법, 생성법,
  그리고 행동에 관련된 일련의 관례를 따라야만 한다.

- 지켜야할 관례

	-> 클래스는 생성자를 가지고 있어야 한다.

	-> 클래스 속성들은 getter, setter 메서드들을 사용해 접근할 수 있어야 한다.
    


< JavaBeans로 getter와 setter 만들기! >

** 캡슐화

- 접근 제한자는 객체지향의 캡슐화, 그리고 그를 통한 은닉화를 위한 도구이다.

- 데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화한다.

- 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게하고 코드를 명확히 함.

- 외부에서 멤버를 엑세스하는 방법을 지정할 수 있도록, 직접 접근을 막거나
  접근 전 부가적인 처리를 요구함.

- 정보를 외부에 은닉하여 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 함.
class Person {
	int age;

	void howOld( ) {
		system.out.println( age );
	}
}

class Main {
	public static void main( String[] args ) {
		Person p1 = new Person( );
		p1.age = -1;
		p1.howOld( );		
	}
}

2-3. 자바빈즈 사용 이유

class Person {
	private int age;

	public void setAge( int age ) {
		if( a >= 0 ) {
			this.age = age;
		} else {
			this.age = 0;
		}
	}

	void howOld( ) {
		system.out.println( age );
	}
}

class Main {
	public static void main( String[] args ) {
		Person p1 = new Person( );
		p1.age = -1;
		p1.howOld( );		
	}
}
- setter는 이렇게 변수의 값 대입이 여러 곳에서, 제한 없이 가능한 것을 접근 제한자로 막고,
  접근 범위에 한해서 메서드로 대입 전 값을 처리 후 대입되게 하기 위해 사용된다.
class Person {
	private int age;
	private String name;
	private String hobby;

	private String gender;

	public void setGender( String gender ) {
		this.gender = gender;
	}

	public void setAge( int age ) {
		if( a >= 0 ) {
			this.age = age;
		} else {
			this.age = 0;
		}
	}

	void howOld( ) {
		system.out.println( age );
	}
}
- 변수의 접근을 private로 처리해서 해당 클래스 안에서만 노출되게 바꾸고,
  다른 사람들도 사용할 필요가 있는 변수들만 getter를 이용해서 드러낸다.

- 이렇게 변수들의 외부 노출을 제한하고, 노출 범위를 정해주는 것이 getter이다.


< JavaBeans로 파라미터가 포함된 생성자를 만들기! >


3. 상속성

3-1. 상속 이해하기

- 클래스 간의 상속이란?

	-> 클래스 간에는 부모-자식의 상속 관계를 설정할 수 있다.

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

	-> B는 A의 public, protected 기능들은 직접적으로 코딩하지 않더라도
       자신의 것으로 사용할 수 있게 된다.

3-2. 상속 정의 방법

- extends 키워드를 사용하여 부모 클래스의 이름을 명시한다.
public class 자식클래스 extends 부모클래스 {
	...
}  


< 부모 클래스 CalcParent >


< 자식 클래스 CalcChild>


< 상속의 기본 예제 >

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

- 클래스의 구조를 표현하는 클래스 다이어그램에서, 상속은 자식 클래스가
  부모 클래스를 가리키는 화살표로 표현한다.

- 클래스 다이어그램에는 상속관계, 클래스이름, 생성자, 메서드 등을 표현한다.

- 상속관계가 이루어질 때 부모 클래스를 super 클래스라 한다.


< 클래스 다이어그램 => 상속 관계의 화살표와 상속받는 멤버변수들 >

3-4. 상속의 활용

- 기존에 존재하는 클래스의 소스 수정 없이 기능을 확장하고자 하는 경우

	-> CalcChild 클래스는 CalcParent 클래스를 상속받기 때문에,
       별도의 소스 코딩 없이도 plus() 메서드와 minus() 메서드를 포함하게 된다.

	-> CalcChild 클래스에 times() 메서드와 divide() 메서드를 추가하면,
       상속받는 메서드에 새로운 기능을 추가하는 효과를 얻을 수 있다.

- 여러 개의 클래스에서 공통되는 기능을 추출하여 공유하기

	-> 질문/답변 게시물의 한 단위를 표현하기 위한 QNAArticle 클래스와
       자료실의 게시물을 표현하기 위한 FileArticle은 글 번호와 제목이라는
       공통된 특성을 갖는다.

	-> Article 클래스는 QNAArticle 클래스와 FileArticle 클래스가 공통적으로
       포함하고 있는 멤버변수인 "글 번호(num)", "제목(title)" 과 이 변수들에
       대한 getter, setter를 추출한 것이다.

	-> 이와 같이 공통 기능을 별도의 클래스로 추출해 내면, 
       코드의 재사용 및 수정이 용이하다. 
       


< 부모 클래스 Article >


< 자식 클래스1 QNAArticle >


< 자식 클래스2 FileArticle >


< Article 클래스와 상속에 대한 결과값 >

profile
도비는 자유에요!😝

0개의 댓글