[TIL] 구디아카데미 22일차: 정보은닉, 캡슐화, RDBMS(오라클)

Mijin·2023년 5월 9일
0

TIL

목록 보기
21/21
post-thumbnail

✅ 정보은닉(information hiding), 캡슐화(Encapsulation)

  • 정보은닉: private으로 정보은닉하면 외부에서 읽을 수 없다
  • 정보은닉의 단계: private → default → protected → public
  • 캡슐화: 정보은닉된 클래스를 set, get메서드를 통하여 외부에서 읽고 쓸 수 있게 된다.
  • 마우스 오른쪽 클릭 → source → Generate getter and setter... 를 통해 자동으로 소스를 생성할 수 있다.

✅필드캡슐화

package vo;

public class Data {
	public int x; 
	private int y;
}
package vo;

public class Data2 {
	public int x; 
	private int y;
}
	// 필드가 정보은닉이 안된 Data클래스 (x,y는 public이므로 외부에서 읽기, 쓰기 가능)
	Data d = new Data();
	d.x = 7;
	d.y = 10;
	System.out.println(d.x); 
	System.out.println(d.y);

	Data2 d2 = new Data2();
	d2.x = 7; 
	// d2.y = 10; // Data2클래스의 y 필드는 private으로 정보은닉 되어있다 (즉, d2.y는 읽기, 쓰기 불가능)
	System.out.println(d2.x); 
	// System.out.println(d2.y);
package vo;
// 필드(속성)정보은닉 + 필드캡슐화
public class Data3 {
	private int x; // 정보은닉
	private int y; // 정보은닉
	
	public int getX() { // getX를 호출하면 읽기 가능 -> 읽기 캡슐화 메서드
		return this.x;
	}
	public int getY() { // getY를 호출하면 읽기 가능 -> 읽기 캡슐화 메서드
		return this.y;
	}
	
	public void setX(int x) { // getX를 호출하면 쓰기 가능 -> 쓰기 캡슐화 메서드
		/*
		if(x<0) { // 입력값은 양수만 가능하게 함
			return;
		}
		*/
		this.x = x;
	} // int값 x를 입력받아서 this.x에 저장하고, 반환값은 없으므로 void
	public void setY(int y) { // getX를 호출하면 쓰기 가능 -> 쓰기 캡슐화 메서드
		this.y = y;
	} // int값 y를 입력받아서 this.y에 저장하고, 반환값은 없으므로 void

	// static메서드는 클래스이름.메서드로 쓰기 때문에 this를 쓸수 없다
}
	Data3 d1 = new Data3();
	Data3 d2 = new Data3();
	
	d1.setX(777);
	d2.setX(444);
	
	System.out.println(d1.getX()); // getX의 this -> d1 -> 반환값 777
	System.out.println(d2.getX()); // getX의 this -> d2 -> 반환값 444

✅메서드 캡슐화

package vo;
// 메서드 캡슐화
public class A {
	private String getFirstName() { // 메서드 정보은닉
		return "구디";
	}
	private String getSecondName() {
		return "아카데미";
	}
	public String getFullName() {
		return this.getFirstName()+this.getSecondName();
	}
	
	/*
	public static void main(String[] args) {
		A a = new A();
		String name = a.getFullName();
		System.out.println(name);
	}
	*/
}
	A a = new A();
	String name = a.getFullName();
	System.out.println(name);
	
	// 메서드가 private으로 정보은닉되어 있어 읽고 쓸 수 없다.
	// String fname = a.getFirstName();
	// System.out.println(fname);

✅캡슐화의 장점

캡슐화를 하면 메서드에서 데이터값의 범위를 정할 수 있다.

package vo;

import java.util.Calendar;

public class Person {
	private int birth; //필드 은닉
	/*
	private int getBirth() { //getter(메서드) 은닉 -> 사용하지 않으므로 삭제해도 무방
		return birth;
	}
	*/
	
	public void setBirth(int birth) {
		if(birth>0) { // birth는 0보다 큰 값만 저장 가능
			this.birth = birth;
		}
	}
	
	public int getAge() {
		if(this.birth > 0) { //birth가 0보다 클 때에만 age출력
			Calendar c = Calendar.getInstance();
			int y = c.get(Calendar.YEAR);
			
			return y-this.birth;
		}
		return 0; // 아닌 경우는 0 출력
	}
}
	Person 루피 = new Person();
	루피.setBirth(1995);
	// System.out.println(루피.getBirth()); // getBirth은닉되어 있어 출력할 수 없다
	System.out.println(루피.getAge());

✅RDBMS

데이터베이스: 논리적 단위(행)들로 이루어진 관련 정보의 집합
  1. 행의 수가 많으면 원하는 정보를 찾는데 오래 걸린다.
  2. index가 되어있다면 조회속도는 빨라지나 입력,출력 속도는 느려진다.
    (마리아DB는 primary key, foreign key에 인덱스, 오라클은 primary key에만 인덱스)
  3. 출력된 이후에는 데이터를 추가하거나 기존의 데이터의 수정/삭제가 어렵다.
관계형 모델: 데이터를 테이블의 집합으로 표현
  1. 포인트를 사용하여 관련 Entity(행)을 조회하는 대신, 중복데이터를 사용하여 서로 다른 테이블의 레코드를 연결
  2. 이상현상(삽입이상, 갱신이상, 삭제이상)을 예방하기 위하여 정규화
    (출처: https://cafe.naver.com/jjdev)

⌨️페이징(Pagination)응용

구글링을 통해 직접 방법을 찾아 이전, 현재, 다음이 아닌 페이지 블럭을 설정하여 페이징을 구현하였다.
(출처: https://beaniejoy.tistory.com/26?category=981157)


💪느낀점

처음에는 정말 직접 찾아서 할 수 있을까 걱정했는데 여러 방법들을 읽고 찾아보면서 지금까지 배우고 연습한 내용으로도 충분히 이해가 가능했다. 앞으로도 시간이 있을 때마다 원하는 기능들을 찾아서 적용해봐야겠다.

profile
개발자로 가는 길 🏃‍♀️

0개의 댓글