클래스를 알아보기 전에 자바에 대해 살짝 정리!
객체 지향 프로그래밍 언어
- Object Oriented Programming Language >OOP
- 객체를 중심으로 프로그램을 만드는 방식
- 클래스라는 설계도를 사용해서,
객체라는 것을 만들고,
만들어긴 객체를 사용해서,
내가 원하는 행동을 구현하는 것.
1. 클래스, Class
2. 객체(개체), Object
3. 인스턴스, Instance
4. 추상화
5. 정보은닉
6. 캡슐화
7. 인터페이스
8. 프로퍼티(Property), 속성(Attribute)
9. 행동(Behavior)
10. 상속(Inheritance)
새로운 데이터 타입을 만드는 데이터 타입 생성기
=> 클래스는 데이터 타입을 만들며 그리고 데이터 타입은 변수를 생성하며 변수에는 상수를 할당할 수 있습니다
데이터 저장 구조 > 관리 용이
각 멤버의 이름 지정 가능 > 데이터 성질 구분 용이
1. 클래스 선언하기
붕어빵 틀 만들기
클래스 명 : 파스칼 표기법 (무조건 대문자로 시작)
class Student{
//구현부
}
절대 규칙
: 파일의 이름과 클래스 이름이 동일해야한다.
=> 안 지키면 컴파일 에러
: 하나의 파일안에 2개 이상의 클래스를 선언 할 때
=> 파일내의 모든 클래스 중 public 를 가지는 클래스는 유일해야한다.
=> public 클래스 > 대표 클래스 > 대표 클래스의 이름이 파일명이 된다.
class Student{
//구현부
//멤버 변수
int age;
String name;
//멤버 메서드
public void hello() {
System.out.printf("안녕하세요. 저는 %s입니다.\n",name);
}
: 클래스는 구조체를 발전시켜 만들어 비슷한 점이 많지만 차이점이 존재한다.
1. 선언과 메모리 할당
: 자바의 클래스 개념에서는 반드시 new 연산자로 메모리를 생성시켜줘여한다!!
=> 생성자 메서드
: new라는 연산자를 이용해서 메모리를 생성하고 생성자메서드를 이용하여 멤버 필드를 초기화 작업 해주는 것!
//자바 클래스 데이터 타입의 변수 선언과 메모리 할당
Student s1 = new Student();
// Student : 클래스로 생성한 데이터 타입
// s1 : Student 데이터 타입으로 선언한 변수
// new : 메모리를 생성하는 연산자
// Student : 메모리 생성 후 초기화 작업 담당하는 생성자
2. 데이터 접근 방법(Private, public)
: 접근제어는 새로운 데이터 타입을 만들고 그 데이터 타입으로 객체를 선언한 후 , 객체 내의 변수 값을 할당 할때 값을 직접 할당 할 수 있는가 없는가를 결정한다.
클래스의 경우
private - 값을 직접 할당 불가능
public - 값을 집접 할당 가능
: 접근제어의 기본 원칙은 메모리가 생성된 후 접근을 말한다.
여기서!!
: 클래스의 실행 타임과 디자인 타임을 명확히 구분해야한다!!
실행 타임
: 객체를 생성하고 메모리를 할당 한 후
디자인 타임
: 현재 클래스 내부를 만들고 디자인 하는 시점
=> 지금은 실행 시의 접근제어에 대해 학습 중!
이는 메모리가 생성된 후 점(.)을 이용해 접근 할 수 있느냐, 못 하느냐가 문제!!
그렇다면
private는 어떻게 접근할까?
=> 메서드 이용
public class Test5{
private int top_secret;
public void setMyTop(int x){
top_secret = x;
}
public int getTop(){
return top_secret;
}
}
public class Test5Main {
public static void main(String[] args) {
int s;
Test5 t5 = new Test5();
t5.setMyTop(1000);
s = t5.getTop();
System.out.println(s);
System.out.println(t5.getTop());
}
}
//출력결과
1000
1000
setMyTop이란 메서드는
: 데이터 타입이 void, 즉 리턴하지 않는 메서드이다.
: int형의 매개변수를 하나 받는다.
: 외부에서 들어오는 데이터를 넘겨 받아 클래스 내부의 멤버 필드에 넣어준다.
getTop
: int형으로 리턴 해주는 메서드
: 매개변수 없음
즉, private로 선언된 멤버 필드에 직접 접근 할 수 없기 때문에 외부로부토 들어오는 데이터를 매개변수를 통해서 내부의 멤버 변수에 전달해주고 외부로 내보낼때는 메서드 리턴을 통해 전달한다.
그리고 Test5이란 데이터 타입은 메모리가 생성된 후
public 메서드 2개를 사용해서 내부의 private 멤버 필드에 값을 넣고 값을 받아내는 역할을 하고 있다.
여기서 궁금한 점 ❗
Q. 어떻게 Public 메서드는 private 멤버필드를 바로 사용할 수 있는가?
: 아까 전에 클래스의 실행 타임과 디자인 타임을 구분해야한다고 말했죵?
: 새로운 데이터 타입을 만드는 순간은 클래스의 디자인 타임입니다. 그리고 만들어진 데이터 타입에 변수를 지정하고 메모리 생성하여 사용하는 것이 실행타임입니다.
즉 접근제어를 할 수 있는 타임은 실행타임이기 때문에 pubilc 메서드가 private 멤버 필드를 사용하는데 문제가 없다.
또한 클래스내의 멤버는 private,public을 따지지 않고 공유가 가능하다.
이렇게 메서드를 이용해서 접근해야 하는 private 멤버변수를 왜 사용해야 할까요..?
: 외부에서 들어오는 데이터를 가공하고 원하는 값으로 내보내기 위해서!!
=> 외부에서 어떤 데이터가 들어와도 public 메서드를 통해야하기 때문에 최종적으로 private 멤버 변수에 들어가 때 데이터를 정제할 수 있다. 또한 내 보낼 때에도 다시 가공해서 내보대기 때문에 데이터를 넣고 빼는 사람은 내부에 어떤 일이 일어나는지 알 필요없이 원하는 값을 얻을 수 있다. = 은폐화