9. 클래스와 객체 1
> 객체지향 프로그래밍과 클래스
Object(객체)
- '의사나 행위가 미치는 대상'
- 구체적, 추상적 데이터 단위
Object Oriented Programming, OOP(객체지향 프로그래밍)
- 객체를 기반으로 하는 프로그래밍
- 객체간의 협력(cooperation)
- cf. 절차 프로그래밍 (Procedural Programming)
> 생활 속의 객체 예
- 학교 가는 과정에 대한 절차적 프로그래밍
- 일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스를 탄다 -> 요금을 지불한다 -> 학교에 도착한다.
- 시간의 흐름에 따른 프로그래밍
- 학교 가는 과정에 대한 객체 지향 프로그래밍
- 객체를 정의
- 객체의 기능구현
- 객체 사이의 협력 구현

> Class(클래스)
class
- 객체에 대한 속성과 기능을 코드로 구현한 것
- '클래스를 정의한다'라고 함
- 객체에 대한 청사진(blueprint)
- 객체의 속성
- property(특성), attribute(속성), member variable(멤버 변수)
- 객체의 기능
- 객체가 하는 기능들을 method로 구현
- method, member function
> Class 정의하기
- class는 대부분 대문자로 시작
- 하나의 java 파일에 하나의 클래스를 두는 것이 원칙이나, 여러 개의 클래스가 같이 있는 경우 public class는 단 하나이며, public class와 java file의 이름이 동일해야 함
- java의 모든 code는 class 내부에 위치
(접근 제어자) class 클래스이름 {
멤버변수;
메서드;
}
ex) student class
- property: 학번, 이름, 학년, 사는 곳 등등
- method: 수강신청, 수업듣기, 시험보기 등등
> package
- 코드들을 관리하기 위해, 클래스들을 계층적으로 구조화한 묶음
- 패키지 안에 있는 class의 이름은 엄연히 따지면 package.classname
- 패키지는 directory로 구조화됨
10. 클래스와 객체 2
> method(메서드)
- 함수의 일종
- 객체의 기능을 제공하기 위해 클래스 내부에 구현되는 함수
(접근 제어자) 반환자료형 methodName (parameter) {
return ;
}
함수
- 하나의 기능을 수행하는 일련의 코드
- 중복되는 기능은 함수로 구현하여 함수 호출하여 사용 (효율적인 코드구현, 유지보수 용이)
> 함수 정의
- 함수를 코드로 구현
- 함수의 이름, 매개변수, 반환 값을 선언하고 코드를 구현함

> 함수와 스택 메모리
- 함수가 호출될 때 사용하는 메모리 - 스택(stack)
- 함수의 기능 수행이 끝나면 자동으로 반환되는 메모리
- 함수 호출과 스택 메모리 구조

11. 클래스와 객체 3
> class & instance
class(static code) --생성(인스턴스화)--> instance(dynamic memory, heap)
> class 생성하기
- 클래스를 사용하기 위해서는 클래스를 생성하여야 함
- new 예약어를 이용하여 클래스 생성
- 클래스형 변수이름(참조변수, reference variable) = new 생성자;
ex) Student studentA = new Student();
> instance와 heap 메모리
- 하나의 클래스 코드로부터 여러 개의 instance를 생성
- instance는 heap memory에 생성됨(property만 생성, method는 다른 공간에 생성)
- 각각의 instance는 다른 메모리에 다른 값을 가짐

- stack의 reference variable은 지역변수로 블럭이 끝날 때 자동으로 없어짐
- heap memory는 c++에서는 사용자가 비워줘야 했지만, java에서는 garbage collector가 정리해준다.
> class, instance, reference variable, 참조 값

> constructor(생성자)
- instance 생성 시 초기화 할 때의 명령어 집합
- constructor에 초기화되지 않은 멤버 변수들의 default 초기화값
- int(정수형 data type): 0
- double(실수형 data type): 0.0
- char(문자형 data type: 0
- boolean: false
- refence varialbe: null
- 생성자의 이름은 그 클래스의 이름과 같음
- 생성자는 method가 아님, 상속되지 않으며, return 값 없음
- 생성자 기본 문법
<access modifiers> <class_name>([<argment_list>]) {
[<statement>]
}
ex) Student studentDoo = new Student();
default constructor
- 하나의 class 안에 반드시 적어도 하나 이상의 constructor가 존재, programmer가 constructor를 기술하지 않으면 compiler가 default constructor 추가해줌
ex) 클래스 안 public Student() {}
- 매개변수 X, 구현부 X
constructor overload
입력값을 받는 생성자가 있어도 default constructor를 사용할 경우 class 내부에 default constructor를 명시해줘야함
12. 클래스와 객체 4
> reference data type(참조 자료형)
변수의 자료형
- primitive data type: int, long, float, double, ...
- reference data type: String, Date, Student, ...
클래스 형으로 선언하는 자료형
+ jdk에서 제공하는 자료형 중 생성자(new ())를 선언하지 않아도 사용할 수 있는 자료형이 있다. ex)String
> 참조 자료형의 예
- 학생의 속성 중 수업에 대한 부분, 수업에 대한 각 속성을 학생 클래스에 정의하지 않고 수업이라는 class로 분리해서 사용
- 이 때, 과목은 참조 자료형으로 선언

? 궁금한 점 ?
public class Point {
int x;
int y;
}
public class Circle {
Point point;
int radius;
public Circle() {
point = new Point();
}
}
// Circle class에서 constructor에 생성자를 쓰는게 아니라
Point point = new Point(); 멤버변수 point 선언에 생성자를 포함하고,
constructor를 안건드려도 되는거 아닐까?
+ eclipse에서 getter와 setter는 우클릭/source에 클릭으로 구현할 수 있게 되어있다.
private
- 외부 class에서 member variable, method에 access(접근)하지 못함
- member variable나 method를 외부에서 사용하지 못하도록 하여 오류 줄임 (데이터의 신뢰성 검토 필요)
- member variable 값이 필요한 경우 get(), set() method를 제공
public
- 외부 class에서 member variable, method에 access(접근) 가능
(default)
- 같은 package 안에서는 access 가능
protected
- 상속 관계에서만 public, 그 외 class에서는 private