객체와 클래스
객체의 정의
new 연산자에 의해 heap 메모리에 생성된 것을 말한다.
클래스의 등장배경
변수 → 배열 → 구조체로 점차 여러 개의 자료형을 여러개의 데이터로 넣는 것으로 발전했다.
구조체 안에 기능을 넣는 형식을 쓰다보니 외부에서 쉽게 접근할 수 있어 구조체안에 기능을 함께 넣어 외부에서 오는 데이터 접근을 private 로 제한하는 캡슐화를 하게되었다.
캡슐화의 정의
- 추상화를 통해 정리된 구조체와 기능을 하나로 묶어 관리하는 기법으로 외부에서 데이터의 직접 접근을 막고 대신 데이터를 처리하는 함수들을 클래스 내부에 작성하는 방법
- private 로 하는 방식인데 만약 public 으로 사용하면 에러는 나지 않지만 캠슐화의 원칙의 위배되는 것이다.
- 멤버 함수는 클래스 밖에서 접근할 수 있다록 public으로 설정한다.
클래스의 정의
객체를 캡슐화를 통해 기능 포함한 개념으로 추상화하여 정의한 것을 의미함
추상화의 정의
프로그램에서 필요한 공통점을 추출하여 불필요한 공통점을 제거하는 과정
예를들어 회원정보관리 프로그램을 만든다고 할때
속성으로 이름, 주소, 성별, 주민등록번호, 전화번호 등등이 될 수 있습니다. 이것을 자료형으로 표현하는 것을 추상화라고 합니다.
클래스 선언
/*[접근제한자] [예약어] class 클래스명{
자료형 변수명;
자료형 변수명;
[접근제한자] 생성자명() {}
[접근제한자] 리턴형 메소드(매개변수) {
기능정의
}
*/
Public class Member{
//필드
private String memberId;
private String memberPwd;
private String memberName;
private int age;
private char gendar;
private String phone;
private String email;
//기능
public Member(){ }
public void setMemberId(String memberId){
this.memberId= memberId;
}
public String getMemberId(){
return memberId
}
//static 일경우
ex>private static memberId;
//static은 get/set도 static이다.
public static void setMemberId(String memberId){
Member.memberId= memberId;
}
public static String getMemberId(){
return memberId
}
//static final일경우
ex> private static final memberId;
//final 상수이니깐 set은 하지 않는다.
public static String getMemberId(){
return memberId
}
- 클래스의 접근 제한자
- public : 같은 패키지랑 import 해주면 전체 클래스에서 사용할 수 있음
- default : 같은 패키지 내에서만 사용 가능
- 클래스 선언 시 사용가능한 예약어
- final : 변경 될 수 없는 클래스로 상속 불가능
- abstract : 클래스내 추상 메소드가 선언 되어 있는 추상클래스, 반드시 후손이 완성해야한다.
- 클래스와 객체의 차이
public class Test{
private int num;
public void test(){
num = 10;
System.out.println(num)
}
public class Main{
public static void main(String[] args){
Test t = new Test();
t.test();
}
}
- 클래스는 사용자 정의의 자료형이라고도 한다.
- 객체는 heap 메모리에 생성되는 공간이라고 할 수 있다.
해당 위에 있는 경우
stack 메모리에 Test t 라는 레퍼런스가 변수가 생긴다.
heap 메모리에는
- new 연산자를 통해 공간이 생긴다.
- 클래스안에 int 라는 자료형 num 필드를 가지고 있고 test() 라는 기능을 가지고 있다.
클래스 필드 예약어
//static 키워드에 대한 구분
public class KindsOfVariable2 {
//전역변수에서 static 키워드 사용가능하다.
public static int staticNum; //static이라는 키워드 기울여서 표현
//public 접근제한자에 static과 final 키워드를 함께 사용하는 것을 '상수필드'
//라고 한다.
//상수필드는 반드시 선언과 동시에 초기화가 되어야 한다.
/*public static final int STATIC_NUM;*/ //에러남 초기값을 해주지않아서
//static 영역은 모든 객체가 공유할 목적으로 사용되기 때문에 캡슣화 원칙에서 위배됨
//따라서 static 키워드는 특별하게 명학한 목적이 있을 경우에만 사용한다.
public static final int STATIC_NUM =1;
//static과 final은 순서가 바꿔도 상관없다.
public final static int STATIC_NUM2 = 2;
public void methodTest() {
//지역변수에는 static 키워드 사용 불가능함
//non-static 메소드는 객체가 만들어져야 실행되기 때문에
//static 키워드가 올 수 없다.
/*static int localStaticNum */ //에러남
}
public static void staticMethodTest() {
//static 메소드 내에서도 static 변수 선언 불가능하다.
//지역변수는 메소드가 호출 될 떄 stack 에 생기기 때문에
//메모리에 생성되는 위치자체가 다르다.
/*static int localStaticNum;*/ //에러남
}
}
- static : 여러 객체가 공유할 목적의 필드에 사용하며 정적메모리영역에 자동 할당되는 멤버에 적용
- final : 하나의 값만 계속 저장해야 하는 변수로 선언과 동시에 초기값을 줘야한다.
접근 제한자
구분 | 해당 클래스 내부 | 같은 패키지 내 | 후손 클래스 내 | 전체 | |
+ | public | O | O | O | O |
# | protected | O | O | O | |
~ | default | O | O | ||
- | private | O |
public class Variable{ //클래스의 첫글자는 대문자로
public static int size;
private int num;
public void test(){
int i = 100;
}
}
public class Main{
public static void main(String[] args){
Variable v = new Variable();
v.test();
}
}
'언어 > JAVA' 카테고리의 다른 글
연산자 (0) | 2022.07.18 |
---|---|
INTERRUPT (0) | 2022.07.07 |
변수(Variable) (0) | 2022.07.07 |