JAVA
캡슐화 (Encapsulation)
캡슐화란 클래스 안에 서로 연관 있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어
데이터를 외부로부터 보호하는 것을 말한다
장점
데이터 보호, 데이터 은닉
데이터 보호 : 외부로부터 클래스에 정의된 속성과 기능들을 보호함
데이터 은닉 : 내부의 동작을 감추고 외부에는 필요한 부분만 노출시킴
자바의 캡슐화는 외부로부터 클래스에 정의딘 속성과 기능들을 보호하고
필요한 부분만 외부로 노출될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을
안전하게 지키는 목적임
기능을 단위별로(class별로) ==> 모듈화, 컨포넌트화
보관하는 JAVA의 특성덕분에 구현에 필요한 기능이 있다면
이미 만들어진 것을 가져오면 된다는 내용
내가 사용하는 클래스, 패키지, 코드덩어리들 ... 내용을 몰라도
"사용방법(용법, 언제쓰는지)"만 알면 쉽게 가져다가 사용할 수 있음
내가 개발한 내용을 상대방이 몰라도 쓸 수 있게 묶어서 배포 == 정보은닉(hiding)
그래서 함수명이 쉬워야하며 인자와 아웃풋이 그럴듯해야됨
메서트 시그니쳐만 보고도 다른 사람들이 쉽게 이해할 수 있어야함
나만아는단어 X, 너무 줄여도 X
input, output 너무 중요 ========>> ★ ★ ★ ★ ★ 설계 ★ ★ ★ ★ ★
package class01;
class Student{
// 클래스 외부에서 멤버변수에 접근하는것을 막아야함 (자바에서 웹개발에서)
// JAVA 공개정책
// "접근제어자"를 사용해서 공개범위를 변경
private int num;
private String name;
private int score;
// private == 클래스 외부에서 접근할 수 없다
// 모든 멤버변수에 private를 반드시 추가해주세요
Student(int num, String name){
this.num = num;
this.name = name;
this.score = 50;
}
@Override
public String toString() {
return this.num +"번 학생"+this.name+"은 "+this.score+"점입니다";
}
// 코드내에 어디서든지 호출될 수 있어야함
// public
public int getNum() { // get은 우리가 값을 받아오기만하기 때문에 아웃풋만 있음
return num;
}
public void setNum(int num) { // set은 우리가 값을 주기만하기 때문에 인자만있고
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
public class Test01 {
public static void main(String[] args) {
// 재시험 등으로 점수가 변경되어야할 때
Student stu1 = new Student(1001,"신짱구");
stu1.setScore(100);
// stu1.score = 100; // 메인이라는 공간에서 짱구의 점수를 바꿀 수 있다?
// 개발자가 임의로 데이터값을 언제든지 수정할 수 있다는 뜻
// 모든 데이터값은 "함수,메서드"를 통해서 변경해야만한다
// 로그(기록)라는게 남아요
// 연산자는 안남아요
System.out.println(stu1.getScore());
System.out.println(stu1);
}
}
private된 멤버변수의 값을 변경하려면 반드시 메서드를 거쳐야된다
멤버변수에 값을 넣었을 때에는 set멤버변수()
멤버변수의 값을 받아올 때에는 get멤버변수()
------------------정리 ------------------
외부 접근을 제한하기 위해 모든 멤버변수 앞에는 private를 붙임
그래서 getter, setter를 반드시 추가해야됨 ==> 호출되어야하기 때문에 public
private는 자식 클래스도 접근 못함
자식 클래스한테는 오픈해줘 ~~ ===> protected
추상화(Abstration)
객체지향 프로그래밍에서의 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의한 것
추상화의 역사
1. 카피하려고 기존의 것들을 살펴봅니다
2. 내가 만드려는 클래스가 기존 클래스의 하위가 아니라,
기존 클래스 급?
3. 복사하면 안된다 ==> 멤버변수가 1231231231231312만개 있으면 어차피 못쓰지 않을까
4. 기존 클래스들의 상위 개념이 있구나 !! ==> 깨달음 !!
== 기존 클래스의 상위개념 == 기존 클래스들에게 공통점이 있구나 !
5. 형체 없이, 기존 클래스들의 공통점을 뽑아냄
== 추상 클래스(기존 클래스들의 상위 클래스) ==> 객체화 XXX
==> 클래스를 정의하는데 활용
클래스들의 틀(추상클래스) ==> 클래스 ==> 객체뽑기
초기 JAVA는 여러개의 국가에서 동시 개발을 했음
네모 세모 원 ===> 공통점이 있었넹;
====> 공통점 뽑아 뽀삐뽀삐뽀 뽀삐뽀
추상 클래스 "abstract"
객체화를 할 수 없음 클래스들을 정의(클래스들의 틀)할 뿐
ex) 포켓몬 포켓몬 = new 포켓몬();
동물 동물 = new 동물();
package class02;
abstract class Shape{ // abstract 추상 클래스
private String name;
protected double area;
Shape(String name){
this.name = name;
this.area =0.0;
}
// 메서드는 쓰라고 만드는거라서
// public 공개정책을 사용
abstract public void darw();
// abstract이 붙은 메서드를
// "추상 메서드"라 부른다
// "오버라이딩 강제"하는 역할★
// 기능의 내용이 필요없기 때문에,
// {} 메서드 바디가 필요없음
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getArea() {
return area;
}
public void setArea(double area) {
this.area = area;
}
@Override
public String toString() {
return this.name +"의 넓이 : " +this.area;
}
}
class Circle extends Shape{
private int radius;
static final double PI = 3.14;
Circle(int radius){
super("원");
this.radius = radius;
this.area=this.radius*this.radius*Circle.PI;
}
@Override
public void darw() {
System.out.println("동그라미 그리기");
// 개발자가 실수로라도 빠뜨리는 일없이 구현할 수 있음
}
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
}
public class Test01 {
public static void main(String[] args) {
// Shape s = new Shape("모양");
// 추상 클래스로는 객체화(인스턴스화) 할 수 없음
// 객체를 생성하려고 존재하는게 아니라,
// 클래스들을 정의하려고 존재하기 때문에
// == 클래스들의 틀
Circle c = new Circle(10);
System.out.println(c);
}
}
추상 클래스에서 자기 자식 클래스에게
특정 메서드를 오버라이딩하라고 "강제"하고 싶다면
오버라이딩을 강제하는 문법이 필요
>> 강제는 개발자에게 좋은 의미
>> 실수를 줄여줌
abstract 추상 메서드
abstract public 메서드명();
------------------정리 ------------------
abstract를 붙인 클래스를 추상 클래스
abstract를 붙인 메서드를 추상 메서드라고 함
추상 클래스는 객체화 X 클래스들의 틀
추상 메서드는 기능구현 X 오버라이딩을 강제하는 역할
추상메서드가 1개이상 존재하려면, 해당 클래스가 반드시 추상클래여야함
세상 모든 JAVA기반 언어들이 공통으로 하는 모토같은게 있는데,
기준이 있는데
"추상화"개념을 반드시 가지고 있다는 점점점점점점점점
인터페이스(Interface)
자식 클래스가 여러 부모 클래스를 상속받을 수 있다면 다양한 동작을 수행할 수 있다는 장점이 있지만
자바에서 클래스를 통한 다중 상속은 지원하지 않음
하지만
인터페이스(Interface)라는 다른 클래스를 작성할 때 기본이 되는 틀을 제공
클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미
자바에서 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도
포함 할 수 있음
하지만 인터페이스(Interface)는 오로지 추상 메소드와 상수만을 포함할 수 있음
인터페이스 사용해야할 때
같은 기능을 수행하는 메서드들끼리 이름이나
인자, 리턴이 다르면 구현이 불리함 == 유지보수가 불리함
같은 기능을 수행하는 메서드들끼리
이름이나 인자, 리턴이 같아야한다?
==> 메서드 시그니쳐를 "강제"해야할 필요성이 있다
오버라이딩을 하면 메서드 시그니쳐가 같습니다 @@!!@!
==> 오버라이딩을 강제해야됨
근데 상속관계가 아닐 때 ====>> 인터페이스 활용
'javaboiii의 JAVA > JAVA 기초' 카테고리의 다른 글
JAVA - MVC패턴 feat.결합도, 응집도 (0) | 2024.07.16 |
---|---|
JAVA - 컬렉션 프레임워크(배열리스트, 맵) (0) | 2024.07.15 |
JAVA - 객체지향 feat.상속, 다형성 (0) | 2024.07.07 |
JAVA - 이중 for문 (0) | 2024.06.27 |
JAVA - 배열 (Array) (0) | 2024.06.27 |