이전 내용 이어서 객체지향에 대해서 자세하게 살펴보자.
1. 객체
객체(Object) VS 객체 (Instance)
나 자신을 객체라고 해보자.
그렇다면 컴퓨터로 나라는 객체를 만들었다고 가정을 했을때,
컴퓨터는 나를 정확하게 설명을 할 수 있을까?
당연히 아니다.
나라는 객체를 컴퓨터로 만들면 완벽한 내가 될 수 없다.
한 단어로 정리해보면 아래와 같다,.
객체(Object) : 나 자신
객체 (Instance) : 프로그래밍으로 한 나 자신 (현실 세계에 있는 나 자신보다는 부족하다)
그래서 앞으로 인스턴스를 생성하시요 ! 라고 했을때 객체를 생성한다고 생각하면 된다.
2. 클래스
클래스란 ?
ㄴ객체의 특성(속성/기능)을 정의한 것이다.
ㄴ객체를 만들기 위한 설계도라고 생각하자.
속성 == 데이터 == 값
기능 ==메소드==행동
1. 클래스 선언
앞에서 잠깐 어떤 형태로 이루워져있는지 확인해봤다. 그렇다면 자세한 설명을 봐보자
클래스 안에는 총 3가지를 가지고 있다. 필드 / 생성자 / 메소드가 있는데, 어떤 것인지 하나씩 살펴보자.
1) 필드 (Field) : 객체의 속성을 작성하는 클래스 내부 영역
- 멤버변수(==필드)라고도 하고 메서드 밖에서 작성된 변수이다.
- 인스턴스 변수 : 필드에 작성되는 일반 변수
- 클래스변수 ( ==static 변수) : 필드에 static 예약어가 작성된 변수
변수가 이렇게 다른 이유는 같은 클래스로 만들어진 객체가 값을 공유 할 수 없기 때문
[접근제한자] [예약어] class 클래스명 : [ ] 안에 있는 것은 생략 가능하다.
[접근제한자] [예약어] 자료형 변수명 [ = 초기값];
+ public final 기본자료형
# protected static 배열
~ (default) final static 클래스명
- private static final (참조형)
* 필드의 접근 제한자의 뜻 : 직접 접근 가능한 범위를 나타냄
[접근제한]
구분 | 해당 클래스 내부 | 같은 패키지 안 | 후손 클래스 내 | 전체 | |
+ | public | O | O | O | O |
# | protected | O | O | O | |
~ | (default) | O | O | ||
- | private | O |
[예약어]
1. final == 상수
ㄴ 한번 지정을 하면 변하지 않는다.
2. static (공전)
1) 공유 메모리 영역(또는 정적 메모리 영역)이 라고 한다.
why?
프로그램 시작시 static이 붙은 코드들은
모두 static 영역에 생성되고, 프로그램이 종료될때까지 사라지지 않는다.
그리고 static 영역에 생성된 변수는 어디서든지 공유할 수 있다.(공유메모리영역)
아래 코드를 보면 오른쪽에 "kh고등학교" 라고 작성된 것을
왼쪽 std1에 학교 이름을 "kh정보교육원"이라고 변경했다.
그렇다면 std2.는 std1.처럼 변경 안했는데 "kh고등학교"라고 쓰여질까 ? 아니다!
static은 공유 메모리 영역으로 "kh정보교육원"이라고 출력하게 된다.
2) 생성자
객체가 만들어질때 어떤 데이터를 가지고 있었으면 좋겠다/ 어떤 기능을 가지고 있었으면 좋겠다!
- new 연산자를 통해서 객체를 생성할때,
생성된 객체의 필드 값 초기화 + 지정된 기능을 수행하는 역할
① 필드 값 초기화
: 값을 대입한다.
②기능 수행
: 프린트 구문을 출력한다.
- 생성자 작성 규칙 !
1) 생성자 이름은 반드시 클래스명과 같아야한다.
2) 반환형이 존재하지 않는다.
- 생성자종류
1) 기본생성자
: 아무것도 없는 것
2) 매개변수 생성자
** 사용되는 기술, 변수 : 매개변수,Overloading(오버로딩),this
** 매개변수 : 생성자나 메소드 호출 시 ()안에 작성되어 전달되어지는 값을 저장하는 변수
전달 받은 값을 저장하고 있는 매개체(지니고있는) 역할의 변수
위에 내용으로 만든 클래스 / 객체이다. 아래 내용을 다시 한번 보면 이해가 잘 될 것 이다!
public class People { peple 클래스 : 객체를 만들기 위한 설계도
//필드
private String name;
private char gender;
private String pNo;
private String address;
private String phone;
private int age;
public void tax() {
System.out.println("세급을 냅니다.");
}
public void vote() {
System.out.println("투표를 합니다.");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getpNo() {
return pNo;
}
public void setpNo(String pNo) {
this.pNo = pNo;
}
public String getAddress() {
return address;
}
public void setAddress(String string) {
this.address = string;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class AbstractionService { 객체
new People();
People p1 = new People();
People p1 : People객체에 주소값을 저장하여 참조하는 변수 p1
new People : 새로운 people객체를 Heap 영역에 생성
클래스 이름이 자료형으로 사용되어 짐 ! people이라고 자료형을 선언해줌 !
People p2 = new People();
만들어진 객체는 추상화(공통점만 추출) 되어 있기 때문에 누군지 어떤 특징이 있는지 모른다!
속성(데이터)를 추가하여 누군지 알 수 있게 함 !
// 직접 접근하는 방법
p1.name = "박도비";
직접 접근 못한다! 왜냐하면 클래스에서 이름을 private으로 적었기 때문에 간접접근해야한다.
//setter을 이용한 간접접근
p1.SetName("다나까");
p1.SetAge(27);
.
.
// 메소드
p1.tax();
직접 접근 가능 public으로 접근제한자 작성
'ON > JAVA' 카테고리의 다른 글
12일차 객체지향에 대해서 복습 및 객체 실습 문제 (0) | 2023.05.02 |
---|---|
11일차_객체지향 3번째 시간 (0) | 2023.05.01 |
9일차_드디어 객체지향 (0) | 2023.04.27 |
8일차_ 2차원 배열 (0) | 2023.04.26 |
8일차_배열 (0) | 2023.04.25 |