#1 교육정리
1) 정보 은닉
2) static 변수
#2 정보은닉
객체 지향 프로그램에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있습니다. 이러한 예약어를 '접근 제어자(access modifier')라고 합니다.
지난번에 만든 코드의 모든 변수에는 public 이라는 예약어가 있습니다. public 이라고 선언한 변수나 메서드는 외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다는 뜻입니다. 반대로 접근 제어자 private로 선언한 변수나 메서드는 외부 클래스에서 사용 할 수 없습니다.
내부에서 사용할 변수나 메서드는 private 으로 선언해서 외부에서 접근하지 못하도록 하는 것을 객체 지향에서는 '정보 은닉'이라고 합니다.
package hiding
public class Student {
int studentID;
private String studentName; // studentName 변수를 private으로 선언
int grade;
String address;
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
package hiding;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.studentName = "이상원"; // 오류 발생
System.out.println(studentLee.getStudentName());
}
}
코드를 수정 및 저장 후 Student.java 파일의 실행 클래스인 StudentTest.java 파일을 보니 오류가 발생합니다. 이유는 studentName 변수의 접근 제어자가 public일 때는 외부 클래스인 StudentTest.java 클래스에서 이 변수에 접근할 수 있었지만, private으로 바뀌면서 외부 클래스의 접근이 허용되지 않기 때문입니다.
get(), set() 메서드)
public 메서드가 제공되지 않는다면 studentName 변수에 접근할 수 있는 방법은 없습니다. 이 때 사용할 수 있는 것이 바로 앞에서 간단히 배운 get(), set() 메서드입니다.
package hiding;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
// studentLee.studentName = "이상원";
studentLee.setStudentName("이상원"); //setStudentName() 메서드를 활용해 private 변수에 접근 가능
System.out.println(studentLee.getStudentName());
}
}
자바에서 사용하는 접근 제어자는 아래와 같습니다.
접근 제어자 | 설명 |
public | 외부 클래스 어디에서나 접근할 수 있습니다. |
protected | 같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고 그 외 클래스에서는 접근할 수 없습니다. |
아무것도 없는 경우(default) | 같은 패키지 내부에서만 접근할 수 있습니다. |
private | 같은 클래스 내부에서만 접근할 수 있습니다. |
#3 static 변수
static 변수란 다른 용어로 '정적 변수' 라고도 합니다. sttic 변수는 자바뿐만 아니라 다른 언어에서도 비슷한 개념으로 사용하고 있는 변수로서 자바에서는 다른 멤버 변수처럼 클래스 내부에 선언합니다. 변수를 선언할 때 다음과 같이 자료형 앞에 static 예약어를 사용합니다.
일반 멤버 변수는 인스턴스가 생성될 때마다 새로 생성되어 각각 다른 studentName을 가지게 되지만, static으로 선언한 변수는 인스턴스가 공유하게 되는 것입니다. 이런 이유 때문에 static 변수를 클래스에 기반한 변수라고 해서 '클래스 변수'라고도 합니다.
정리하자면,
일반적으로 우리가 만든 Class는 Static 영역에 생성되고, new 연산을 통해 생성한 객체는 Heap영역에 생성됩니다. 객체의 생성시에 할당된 Heap영역의 메모리는 Garbage Collector를 통해 수시로 관리를 받습니다. 하지만 Static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만, Garbage Collector의 관리 영역 밖에 존재하므로 Static을 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채로 존재하므로 자주 사용하게 되면 시스템의 퍼포먼스에 악영향을 주게 됩니다.
Java에서 Static 변수는 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 변수로, 메모리에 한번 할당되므로 여러 객체가 해당 메모리를 공유하게 됩니다.
구분해서 정리하자면 아래와 같습니다.
1. static 변수 및 static 메소드 특징
- 클래스가 메모리에 로드될때, 스태틱(static) 메모리 영역에 생성됩니다.
- 인스턴스를 생성하지 않고도 사용할 수 있습니다.
- 동일 클래스의 모든 인스턴스에서 공유하여 사용됩니다.
- 클래스당 하나만 생성되며, 클래스 멤버라고도 부릅니다.
- static 메소드 안에서는 static 멤버들만 사용할수 있고, 인스턴스 멤버는 사용할 수 없습니다.
2. static 변수 및 static 메소드 사용목적
- 모든 클래스에서 호출 가능한 전역변수나 전역함수를 만들기 위해 사용
- static 멤버는 클래스당 하나만 생성되어 클래스의 인스턴스 사이에서 공유됨으로 공유멤버가 필요할 때 사용
변수 유효범위)
1. 지역 변수
지역 변수는 함수나 메서드 내부에 선언하기 때문에 함수 밖에서는 사용할 수 없습니다. 즉, 하나의 함수에 선언한 지역 변수는 다른 함수에서 사용할 수 없습니다. 지역 변수가 생성되는 메모리를 스택(stack)이라고 합니다. 스택에 생성되는 지역 변수는 함수가 호출될 때 생성되었다가 함수가 반환(return)되면 할당되었던 메모리 공간이 해제되면서 함께 없어집니다.
2. 멤버 변수
멤버 변수는 new 키워드로 인스턴스를 생성해야 사용할 수 있습니다. 멤버 변수는 인스턴스 변수라고도 합니다. 클래스가 생성될 때 힙(heap) 메모리에 생성되는 변수입니다. 멤버 변수는 클래스의 어느 메서드에서나 사용할 수 있습니다. 힙에 생성된 인스턴스가 가비지 컬렉터(garbage collector)에 의해 수거되면 메모리에서 사라집니다. 따라서 클래스 내부의 여러 메서드에서 사용할 변수는 멤버 변수로 선언하는 것이 좋습니다.
멤버 변수를 private 으로 하면 다른 클래스에서는 접근이 제한됩니다. 다른 클래스에서 private 멤버 변수를 사용하려면 getter와 setter 처럼 그 클래스의 메서드를 통하는 방식으로 사용하므로 데이터의 보안성이 좋아지니다.
멤버 변수는 클래스 안에 있지만 인스턴스를 생성하기 전에는 사용할 수 없습니다.
3. static 변수
사용자가 프로그램을 실행하면 메모리에 프로그램이 상주합니다. 이 때 프로그램 영역 중에 데이터 영역이 있습니다. 이 영역에는 상수나 문자열, static 변수가 생성됩니다. 인스턴스 변수는 객체가 생성되는 문장 즉 new가 되어야 생성되지만, static 변수는 클래스 생성과 상관없이 처음부터 데이터 영역 메모리에 생성됩니다. 따라서 인스턴스 변수와 static 변수는 사용하는 메모리가 다릅니다.
미리 생성되있기에 속도는 빠르지만 프로그램이 종료될 때 까지 메모리에서 해제되지 않는다. static 변수를 많이 쓰면 시스템의 메모리가 그만큼 줄어드니 주의할 필요가 있다. 다른 변수들은 실행도중 메모리를 할당하고 해제 하지만 static은 그렇지 않다.
*순서 : 프로그램 실행 >> 클래스 로드 (static 생성) >> 인스턴스 생성
에디터를 열고 main 함수에 소스코드를 작성하기 시작할 때 이미 메모리에 올라와 있는 변수들도 있다. java.lang 패키지에 있는 Math 같은 클래스 이다. (아래) public static final double PI 는 static 이다. main 함수에서 Math.PI 라고 사용하면 된다.
변수 유형에 따른 용도)
변수 유형 | 선언 위치 | 사용범위 | 메모리 | 생성과 소멸 |
지역 변수 (로컬 변수) |
함수 내부에 선언 | 함수 내부에서만 사용 | 스택(stack) | 함수가 호출될 때 생성되고함수가 끝나면 소멸함 |
멤버 변수 (인스턴스 변수) |
클래스 멤버 변수로 선언 | 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용가능 | 힙(heap) | 인스턴스가 생성될 때 힙에생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨 |
static 변수 (클래스 변수) |
static 예약어를 사용하여 클래스 내부에 선언 | 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램이 처음 시작할 때상수와 함께 데이터 영역에생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨 |
'[Naver Cloud Camp 7] 교육 정리' 카테고리의 다른 글
네이버 클라우드 캠프 32일차 230609 (1) | 2023.06.10 |
---|---|
네이버 클라우드 캠프 31일차 230608 (0) | 2023.06.08 |
네이버 클라우드 캠프 29일차 230605 (0) | 2023.06.05 |
네이버 클라우드 캠프 28일차 230602 (0) | 2023.06.02 |
네이버 클라우드 캠프 27일차 230601 (0) | 2023.06.01 |