2023. 6. 14. 23:20ㆍ개발/☕ JAVA
캡슐화
캡슐화 : 클래스 안에 서로 관련이 있는 변수(속성)와 메소드(기능)를 묶어서 외부에서 접근하지 못하도록 보호하는 것
Java는 캡슐화를 통해 데이터를 외부로부터 은닉함으로써 보호한다
즉, 내부적으로만 사용되는 데이터를 접근 제어자를 통해 은닉하여 외부로부터 클래스 내 멤버들을 보호하는 것이다
이제 캡슐화를 구현하는 JAVA의 몇몇 개념들을 정리해보자
1. 클래스 / 객체
클래스 : 객체 모양을 선언한 틀 / 객체를 정의해놓은 것
객체 : 클래스의 모양대로 생성된 실체
클래스로부터 객체를 만드는 과정을 인스턴스화라고 하고 이때 생성된 객체를 인스턴스라고 한다
객체의 생성
: 클래스명 변수명 = new 클래스명()
이때 변수를 참조 변수라고 하며 참조 변수에는 인스턴스의 주소값이 담기고 인스턴스는 참조 변수를 통해서만 다룰 수 있다
객체의 멤버(구성요소)
: 변수(속성)와 메서드(기능)
2. 변수 / 메서드
1 ) 변수
변수는 클래스 변수, 인스턴스 변수, 지역 변수 세 가지가 있다
변수를 구분짓는 것은 변수의 선언 위치다

* 클래스 변수 vs 인스턴스 변수
클래스 변수는 인스턴스 변수 앞에 static을 붙여서 선언한다
클래스 변수와 인스턴스 변수는 모두 클래스 영역 내에 선언되는 변수지만 생성 시기와 저장 공간에 차이점이 있다
인스턴스 변수는 인스턴스를 생성해야만 사용 가능하고 독립된 저장 공간을 갖는다(인스턴스마다 값을 다르게 저장 가능 )
클래스 변수는 인스턴스를 생성하지 않아도 사용 가능하며 공통된 저장 공간을 갖는다(모든 인스턴스에서 같은 값으로 저장)
지역 변수는 선언된 위치(블럭{}) 내에서만 사용 가능하며 그 위치를 벗어나면 소멸되어 사용할 수 없게 된다
2 ) 메서드
메서드는 클래스 내 함수라고 할 수 있다
메서드를 사용하는 이유는 1. 높은 재사용성 2. 코드 중복 방지 3. 프로그램의 구조화 이다
메서드는 선언부와 구현부로 나눠져 있고
선언부
: 접근 지정자 리턴타입 메서드명 (매개변수)
전달할 수 있는 매개 변수 종류 : 기본 자료형, 객체, 배열
구현부
: 지역 변수와 return문으로 이루어져 있다
public class Circle{
int radius; // 멤버 변수
String name; // 멤버 변수
public Circle() {} // 기본 생성자
// 메서드
public double getArea() {
return 3.14*radius*radius;
}
public static void main(String[] args) {
Circle pizza = new Circle(); // 객체 pizza 생성
pizza.radius = 10; // pizza의 멤버 변수 초기화
pizza.name = "자바피자";
double area = pizza.getArea(); // pizza의 메서드 호출
System.out.println(pizza.name + "의 면적은 " + area);
}
}
3. 제어자
제어자는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다
1 ) 접근 지정자
접근 지정자를 통해 외부로부터 클래스나 클래스 멤버에 대한 접근을 제한할 수 있다
이를 통해 외부로부터 데이터를 보호하고 내부적으로만 사용되는 데이터를 감출 수 있다

2 ) 접근 지정자 외의 제어자
static - "공통적인" "클래스의"
: 클래스 내에서 선언 / 인스턴스를 생성하지 않아도 사용 가능
: 공통의 저장 공간 -> 모든 인스턴스에서 그 값이 동일
여러 인스턴스에서 사용되고 모든 인스턴스에서 값이 동일하게 유지되어야 하는 멤버에 사용
final - "마지막의" "변경될 수 없는"
: final을 붙이면 변경이 불가능
: 변수 -> 상수 / 메서드 -> 오버라이딩 불가 / 클래스 -> 상속 불가
변경되면 안 되는 멤버에 사용
abstract - "추상의" "미완성의"
: 구체적인 내용을 작성하지 않은 멤버에 사용
: 인스턴스 생성 불가
: 메서드 -> 선언부만 작성 / 클래스 -> 클래스 내에 추상 메서드가 선언되어 있음
미완성 멤버에 사용
4. 생성자
생성자 : 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
- 생성자 이름 = 클래스 이름
- 생성자는 리턴 값 X
- 생성자는 객체가 생성될 때 자동으로 한번 호출
- 생성자는 매개변수를 변경하여 여러개 작성 가능 (오버로딩)
- 생성자는 클래스 1개당 무조건 1개 존재, 코드로 명시하지 않았다면 컴파일러에서 기본 생성자 자동 생성
* 기본 생성자 : 매개변수나 내용이 전혀 없는 생성자
- 코드에 생성자가 적어도 하나 명시되어 있다면 컴파일러에서 기본 생성자 자동 생성 X
-> 이 경우, 코드에 기본 생성자가 없더라도 자동 생성되지 않음
5. this / this()
this
: 인스턴스 자신을 가리키는 참조 변수
: 인스턴스의 주소 저장되어 있음
- 자기 자신의 메모리(변수, 메서드)를 가리킴
this()
: 생성자 내에서 생성자를 호출할 경우 사용
- 생성자 내에서 생성자를 호출할 경우 this() 말고 클래스명을 사용하면 에러
- 생성자 내에서 생성자를 호출하는 코드는 맨 첫줄에 있어야 함
6. getter / setter
getter / setter 는 캡슐화를 유지하면서 접근이 제한되어 있는 데이터를 사용하고 싶을 때 쓰는 메서드다
getter : 클래스 내 데이터를 읽어와서 반환하는 메서드
setter : 클래스 내 데이터를 설정, 변경하는 메서드
getter / setter 를 선언하는 방법은 메서드 이름 맨앞에 각각 get과 set을 붙이는 것이다
이때 getter / setter 메서드는 public으로 설정한다
외부에서 접근이 가능한 public 메서드에 접근이 제한된 데이터를 포함시켜서 메서드를 이용해 접근이 제한된 데이터에 접근하는 것이다
public class java {
// 접근 제한된 데이터
private String color = "red";
//getter - public으로 설정
public String getColor() {
return color;
}
//setter - public으로 설정
public String setColor(String c) {
this.color = c;
return color;
}
public static void main(String[] args) {
java Color = new java(); // 코드에 생성자 명시X -> 컴파일러에서 기본 생성자 자동 생성
String c = Color.getColor();
System.out.println(c);
String co = Color.setColor("blue");
System.out.println(co);
}
}
public class java {
// 접근 제한된 데이터
private String color;
private String code;
public java(String color) {
this.color = color;
}
// 생성자 오버로딩 가능
public java(String color, String code) {
this(color); //this()를 사용해 생성자 내 생성자 호출
this.code = code;
}
//getter - public으로 설정
public String getColor() {
return color;
}
//setter - public으로 설정
public String setColor(String c) {
this.color = c;
return color;
}
public static void main(String[] args) {
java Color1 = new java("red");
java Color2 = new java(); // 코드에 생성자 명시O -> 컴파일러에서 기본 생성자 생성X -> 에러 발생
java Color3 = new java("red", "45h8");
String c = Color1.getColor();
System.out.println(c);
String co = Color1.setColor("blue");
System.out.println(co);
}
}
'개발 > ☕ JAVA' 카테고리의 다른 글
☕ Java 예외 처리 (0) | 2024.07.26 |
---|---|
☕ Java 다형성 ( 오버라이딩, 오버로딩 ) (1) | 2024.07.24 |
☕ Java I/O Stream (1) | 2024.07.17 |
☕ Java 상속 ( super, 업캐스팅 / 다운캐스팅, instanceof ) (0) | 2023.06.15 |
☕ Java의 객체 지향적 특징 (추상화, 캡슐화, 상속, 다형성) (0) | 2023.06.12 |