05-1. 객체 지향 프로그래밍과 클래스
객체(Object)
- 의사나 행위가 미치는 대상 (사전적 의미)
- 구체적, 추상적 데이터의 단위 (학생, 회원, 생산, 주문, 배송)
객체 지향 프로그램과 절자 지향 프로그래밍
- 절차 지향 프로그래밍 : 시간이나 사건의 흐름에 따라 프로그래밍
- 객체 지향 프로그래밍 : 행위에 따른 객체가 생성되고, 이 객체들 간의 협력에 따라서 진행이 됨
객체 지향 프로그램은 어떻게 구현하는가?
- 객체를 정의 하고
- 각 객체 제공하는 기능들을 (메서드로) 구현하고
- 각 개체가 제공하는 기능들 간의 소통(메세지 전달)을 통하여 객체간의 협력을 구현
객체를 찾아보자
- 온라인 쇼핑몰에 회원 로그인을 하고 여러 판매자가 판매하고 있는 제품 중 하나를 골라 주문을 한다
- 아침에 회사에 가는 길에 별다방 커피숍에 들려 아이스 카페라떼를 주문했다
- 성적확인을 위해 학사 관리 시스템에 로그인 하여 수강 한 과목들의 성적을 확인했다
클래스는 객체의 청사진(blueprint) 이다
- 객체 지향 프로그램은 클래스를 기반으로 프로그래밍한다
- 클래스는 객체의 속성과 기능을 코드로 구현한 것이다 (= '클래스를 정의한다')
- 객체의 속성은 클래스의 멤버 변수(memver variable)로 선언 함
객체 지향 프로그램을 할 때는
- 객체를 정의 하고
- 각 객체의 속성을 멤버 변수로 역할을 메서드로 구현하고
- 각 객체 간의 협력을 구현한다
클래스 코딩하기
- 클래스는 대문자로 시작 (코딩 컨벤션 - 코딩을 할 때 읽기 쉽고 이해하기 쉽도록 정한 규칙)
- java 파일 하나에 클래스는 여러 개가 있을 수 있지만, public 클래스는 하나이고, public 클래스와 .java 파일의 이름은 동일함
- camel notation 방식으로 명명
(접근 제어자) class 클래스이름 { 멤버 변수; 메서드; } |
05-2. 클래스 살펴보기
변수의 자료형
- 기본 자료형 : int, long, float, double 등
- 참조 자료형 : String, Date, Student 등
05-3. 메서드
함수란 (function)
- 하나의 기능을 수행하는 일련의 코드
- 구현된(정의된) 함수는 호출하여 사용하고 호출된 함수는 기능이 끝나면 제어가 반화됨
- 함수로 구현된 하나의 기능은 여러 곳에서 동일한 방식으로 호출되어 사용될 수 있음
함수 정의하기
- 함수는 이름, 매개 변수, 반환 값, 함수 몸체(body)로 구성됨
int(함수 반환형) add(함수 이름) (int num1, int num2)(매개변수) { int result; result = num1 + num2; return(예약어) result; } |
return 예약어와 반환형
- 함수를 수행한 후 결과 값은 변수 result에 저장되고, result에 저장된 결과 값은 함수를 호출했을 때 반환되는 값이므로 '반환 값' 이라고도 부름
- 즉, '이 함수의 결과 값을 반환합니다' 를 뜻하는 예약어가 return
- 반환 값에 따라 자료형 (반환형)을 함수 이름 옆에 써줌 (int 같은)
void
- 반환값이 없는 함수
- '비어 있다'는 의미로 '반환할 값이 없다' 를 뜻하는 예약어
예제
![]() |
함수호출과 스택 메모리
- 스택 : 함수가 호출될 때 지역 변수들이 사용하는 메모리 (함수를 호출하면 그 함수만을 위한 메모리 공간이 할당됨)
- 함수의 수행이 끝나면 자동으로 반환
- 함수를 호출한 순서대로 메모리 공간이 만들어지고 맨 마지막에 호출한 함수부터 반환됨 ㅡ> 메모리 공간도 맨 마지막에 추가된 것부터 스택에서 사라짐
- 호출 A() -> B() -> C()
- 소멸 C() -> B() -> A()
지역변수
- 함수 내부에서만 사용하는 변수
- 지역 변수는 스택 메모리에 생성됨
- main() 함수에서 사용하는 변수와 add() 함수에서 사용하는 변수는 서로 다른 메모리 공간을 사용하므로 이름이 같든 다르든 상관없다
메서드 (method)
- 객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수
- 멤버 함수 (member function) 이라고도 함
- 메서드를 구현함으로써 객체의 기능이 구현 됨
- 메서드의 이름은 그 객체를 사용하는 객체(클라이언트)에 맞게 짓는 것이 좋음
예제
![]() |
![]() |
결과
![]() |
05-4. 클래스와 인스턴스
인스턴스 (instance)
- 클래스는 객체의 속성을 정의 하고, 기능을 구현하여 만들어 놓은 코드 상태
- 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨
- 가령, 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년 등의 값을 가지게 됨
- new 키워드를 사용하여 인스턴스 생성
힙 메모리
- 생성된 인스턴스는 동적 메모리(heap memory)에 할당됨
- C나 C++ 언어에서는 사용한 동적 메모리르 프로그래머가 해제 시켜야 함 (free() 난 delete 이용)
- 자바에서 Gabage Collector가 주기적으로 사용하지 않는 메모리를 수거
- 하나의 클래스로 부터 여러 개의 인스턴스가 생성되고 각가 다른 메모리 주소를 가지게 됨
용어 정리
- 객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
- 클래스 : 객체를 프로그래밍 하기 위해 코드로 정의해놓은 상태
- 인스턴스 : new 키워드를 사용하여 클래스를 메모리에 생성한 상태
- 멤버 변수 (속성) : 클래스의 속성, 특성
- 메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
- 참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
- 참조 값 (해쉬코드값) : (참조 변수를 출력해보면) 생성된 인스턴스의 메모리 주소 값
05-5. 생성자
생성자 (constructor)
![]() 생성자 만들기 |
![]() 생성자 테스트하기 |
- 생성자 기본 문법 <class_name>([<argument_list]) { [<statements] }
- 객체를 생성할 때 new 키워드와 함께 사용 - new Student();
- 생성자는 일반 함수처럼 기능을 호출하는 것이 아니고 객체를 생성하기 위해 new와 함께 호출됨
- 객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출함
- 생성자는 반환 값이 없고, 클래스의 이름과 동일
- 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private 으로 선언되는 경우도 있음
기본 생성자 (default constructor)
![]() 자바 컴파일러가 자동으로 제공하는 디폴트 생성자 |
- 클래스에는 반드시 적어도 하나 이상의 생성자가 존재
- 클래스에 생성자를 구현하지 않아도 new 키워드와 함께 생성자를 호출할 수 있음
- 클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어 줌 public Student(){}
- 매개 변수가 없음, 구현부가 없음
여러가지 생성자를 정의하는 생성자 오버로딩 (overloading)
생성자 정의 하기
- 생성자를 구현해서 사용할 수 있음
- 클래스에 생성자를 따로 구현하면 기본 생성자 (default constructor)는 제공되지 않음
- 생성자를 호출하는 코드 (client 코드)에서 여러 생성자 중 필요에 따라 호출해서 사용할 수 있음
- 오버로딩 : 생성자가 두 개 이상 / 이름은 같고 매개변수가 다름으로써 여러가지의 생성자나 메서드가 있는 것
05-6. 참조 자료형
- 클래스형으로 변수를 선언
- 기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다름
- 참조 자료형을 사용할 때는 변수에 대해 생성하여야 함 (String 클래스는 예외적으로 생성하지 않고 사용할 수 있음)
예를 들면
학생에 대한 클래스인데 과목에 대한 변수가 계속 늘어나고 있다 (국어점수, 수학점수, 국어과목, 수학과목..)
문제를 해결하기 위해 과목을 의미하는 Subject 라는 클래스를 새로 만들어보자!
Subject 클래스는 과목의 이름과 점수를 멤버 변수로 가지고 있다.
이렇게 수정하면
1. 과목과 관련한 내용은 Subject 클래스로 분리하여 구현할 수 있고
2. Student는 Subject 클래스를 멤버 변수로 가지면 된다
예제
![]() |
![]() |
![]() |
05-7. 정보 은닉
접근 제어 지시자 (acceess modifier)
- 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
- public : 클래스의 외부 어디서나 접근 할 수 있음
- private : 같은 클래스 내부에서만 접근 가능 (외부 클래스, 상속 관계의 클래스에서도 접근 불가)
- 아무것도 없음 (default) : 같은 패키지 내부에서만 접근 가능 (상속 관계라도 패키지가 다르면 접근 불가)
- protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 할 수 없음
get() / set() 메서드
- pricate 으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공
- get() 메서드만 제공 되는 경우 read-only 필드
- 이클립스에서 자동으로 생성됨
이클립스에서 자동으로 get(), set() 메서드 만들기 이클립스 편집기 창의 멤버 변수를 선언한 클래스 내부에서 오른쪽 마우스를 클릭하고 [Source ㅡ> Generate Getters and Setters...] 메뉴를 클릭 ![]() get set 메서드를 추가하고 싶은 멤버 변수를 선택하고 Generate 하면 해당 변수의 get() set() 메서드가 생성! |
정보 은닉을 활용한 캡슐화 (encapsulation)
- 꼭 필요한 정보와 기능만 외부에 오픈함
- 정보를 클래스화 해서 멤버 변수와 메서드를 감추고(private) 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 함
- 각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화 함
'Programming Language > JAVA' 카테고리의 다른 글
[Do it 자바 프로그래밍 입문] 07.배열과 ArrayList (0) | 2023.05.15 |
---|---|
[Do it 자바 프로그래밍 입문] 06.클래스와 객체 2 (0) | 2023.05.12 |
[Do it 자바 프로그래밍 입문] 연습문제 - 다이아몬드 모양 (0) | 2023.05.10 |
[Do it 자바 프로그래밍 입문] 04.제어 흐름 이해하기 (0) | 2023.05.09 |
[Do it 자바 프로그래밍 입문] 03.자바의 여러 가지 연산자 (0) | 2023.05.09 |