9시에 못 일어날까봐 밤을 샜더니 정신이 몽롱한 달거북씨의 오늘의 공부.

자바 기초 때 배웠던 거랑 순서라든가 코딩이라든가 또 다른 느낌이라 매일매일이 새롭네 하하;

그리고 하루에 진도가 딱딱 나가는 게 아니라 둘째날까지 이어지는 내용이 있다 보니 정리하기도 곤혹스럽고 아마 읽는 사람도 정신없지 않을까 싶다.(만약 읽으시는 분이 있다면)


 

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 클래스만 존재할 수 있다. > 클래스 별로 파일 제작

 

2-2. 자바빈즈(JavaBeans)

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

▶ 말이 너무 어렵다. 가장 중요한 것은 자바빈즈가 많은 객체를 단일 객체(빈)로 캡슐화하는 클래스란 점인 것 같다.

 

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

  • *** 캡슐화 ***
    - 접근제한자는 객체지향의 캡슐화, 그리고 그를 통한 은닉화의 도구이다.
    - 데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화한다.
    - 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게 하고 코드를 명확히 함
    - 외부에서 멤버를 엑세스 하는 방법을 지정할 수 있도록, 직접 접근을 막거나 접근 전 부가적인 처리를 요구함
    - 정보를 외부에 은닉하여 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 함

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();    
    }
}
class Person{
	private int age;	// private를 사용하여 직접 접근을 막아준다.
    
    public void setAge(int age){	// 데이터에 오류가 있는 것이기 때문에 set으로 받아와 통제한다.
    	if(age >= 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;
    
	// setter는 작성하나 getter는 작성하지 않음으로써, 값은 기입받아도 값을 알 수 없게 할 수 있다.   
    public void setGender(String gender){
    	this.gender = gender;				 
    }
    
    public void setAge(int age){
    	if(age >= 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();    
    }
}
  • 게터 사용 이유
    - 변수의 접근을 private로 처리해서 해당 클래스 안에서만 노출되게 바꾸고, 다른 사람들도 사용할 필요가 있는
      변수들마나 getter를 이용해서 드러낸다.
    - 이렇게 변수들의 외부 노출을 제한하고, 노출 범위를 정해주는 것이 getter

 


Member 클래스(자바빈즈)
메인 클래스에서 출력 진행


기나긴 코드의 article 클래스. 멤버변수 모두 getter와 setter로 설정해주어서 코드가 무척 길다
Main 클래스는 다행히 간단하다.


 

 

 

3. 상속성

3-1. 상속 이해하기

  • 클래스 간의 상속이란?
    → 클래스 간에는 부모-자식의 상속 관계를 설정할 수 있다.
    → 부모클래스 A를 자식클래스 B가 상속받았을 대, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속받게 된다.
        (단, private으로 설정된 기능은 상속되지 않는다.)
    → B는 A의 public, protected 기능들은 직접적으로 코딩하지 않더라도 자신의 것으로 사용할 수 있게 된다.

 

3-2. 상속 정의 방법

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

 

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

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

 

3-4. 상속의 활용

부모클래스
자식클래스
부모클래스 객체, 자식클래스 객체 생성 후 출력

  • 기존에 존재하는 클래스의 소스 수정 없이 기능을 확장하고자 하는 경우
    → CalcChild 클래스는 CalcParent 클래스를 상속받기 때문에, 별도의 소스코딩 없이도 plus() 메서드와 minus()
       메서드를 포함하게 된다.
    → CalcChild 클래스에 times()메서드와 divide()메서드를 추가하면 상속받는 메서드에 새로운 기능을 추가하는
       효과를 얻을 수 있다.

 

QNAArticle 클래스와 FileArticle 클래스의 공통 특성을 변수로 갖는 부모클래스
QNAArticle 자식클래스
FileArticle 자식클래스
toString()을 이용하면 한 번에 출력이 가능하다

  • 여러 개의 클래스에서 공통되는 기능을 추출하여 공유하기
    → 질문/답변 게시물의 한 단위를 표현하기 위한 QNAArticle 클래스와, 자료실의 게시물을 표현하기 위한
        FileArticle은 글 번호와 제목이라는 공통된 특성을 갖는다.

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

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

 


 

+ 클래스를 만들 때마다 getter, setter를 무조건 만들고 있어서 왜 그럴까 했는데, 강사님이 일단 만들고 기능을 추가하거나 필요없으면 삭제하는 식으로 나가신다고 하셨다.

728x90

+ Recent posts