▶ 객체(Object)
1. 객체란
사전적 의미로 현실세계에 존재하는 모든 것을 의미한다.(유형, 무형, 개념, 사물)
2. 객체지향언어란
"객체"를 지향하는 언어로 "객체 중심"으로 돌아간다.
3. 객체지향 프로그램이란
현실세계에서 독립적인 존재들인 객체들 간의 상호작용을 프로그래밍을 통해 가상세계로 구현하는 과정이다.
4. 구현하고자 하는 프로그램 상의 필요한 객체를 만들기 위해서는 클래스라는 틀을 먼저 만들어줘야 한다.
클래스 : 각 객체들의 속성(정보)들을 담아낼 수 있는 그릇 같은 존재
- 클래스를 보관할 때 보관할 패키지명은 vo(Value Object)
- 클래스 만드는 방법 => 1단계 추상화 + 2단계 캡슐화
5. 추상화 과정
1) 내가 구현하고자 하는 프로그램에서 필요한 객체들을 생각해 볼 것
ex) 학생관리프로그램 => '학생'객체 : 홍길동학생, 김갑생학생, 정동현학생 등등...
2) 그 객체들이 가지고 있는 공통적인 속성, 기능들을 모두 추출할 것
ex) 이름, 나이, 성별, 학년, 학번, 주소, 주민번호, 전화번호, 키 등등...
3) 추출한 것들을 가지고 내가 구현할 프로그램에 "실질적인 목적"에 맞춰 불필요한 속성, 기능들을 제거해서 추려나가기
4) 최종적으로 추려진 속성들을 가지고 어떤 자료형의 어떤 이름으로 사용할 것인지 생각해 보기
6. 위에 선정한 것들을 가지고 본격적인 프로그래밍 시작
구조체를 사용하여 프로그래밍 (구조체 : 한 번에 여러 개의 자료형을 보관할 수 있는 배열 같은 형태)
나만의 배열 같은 자료형을 만들 수 있다. => 클래스
7. 캡슐화 과정을 통해 완벽한 클래스의 형태를 갖추게 하기
캡슐화란 추상화를 통해 정의된 속성들과 기능들을 하나로 묶어서 관리하는 기법 중 하나이다.
클래스에서의 가장 중요한 목적인 "데이터의 접근제한"을 원칙으로 외부로부터 "데이터의 접근"을 막고 대신에 '데이터를 간접적으로나마 처리(값을 대입, 값을 돌려줌)'할 메서드를 클래스 내부에 작성해서 관리하는 방식이다.
캡슐화를 하지 않으면 외부로부터 직접 접근이 가능하기 때문에 함부로 값이 변질되거나 조회를 막지 못하는 문제 발생한다.
1) 정보은닉 : private
필드들을 외부로부터 직접 접근을 막기 위해 public 대신에 private 접근제한자 사용
ex) 학생들이 본인의 성적을 함부로 바꿀 수 없게끔 만들기
2) setter / getter 메서드
간접적으로나마 접근해서 값을 담거나(변경하거나) 그 값을 가져올 수 있도록 도와준다.
▶ 클래스의 구조
public class 클래스명 {
// 필드부
// 생성자부
// 메서드부
}
※ 필드, 메서드 접근시 . 으로 가져온다.
■ 필드부
[표현법]
접근제한자 예약어(생략가능) 자료형 필드명(변수명);
필드 == 맴버변수 == 인스턴스변수
접근제한자 : 이 필드에 접근할 수 있는 범위를 제한할 수 있다.
클래스 영역 안에서 필드를 선언할 때 반드시 접근제한자를 써줘야 한다.
(+) public => 어디서든 접근 가능하게 하고 싶다.
(#) protected => 같은 패키지라면 무조건 접근 가능, 다른 패키지라면 상속구조인 클래스에서만 접근 가능하다.
(~) default => 오로지 같은 패키지 안에서만 접근 가능, 생략 가능
(-) private => 오직 해당 클래스 안에서만 접근 가능
위에서부터 아래로 내려갈수록 접근할 수 있는 범위가 좁아진다.
※ 필드를 public으로 작성 시
- 직접적으로 접근해서 값 대입이 가능하고, 조회할 수 있는 경우 보안 문제가 발생할 수 있다.
- 외부에서 함부로 값을 변절시키거나, 조회권한이 없는 사람이 값을 쉽게 가져올 수 있는 문제 발생
- 값을 함부로 바꾸면 안 되는데, 변경될 수가 있다.
이때는 캡슐화로 해결이 가능하다.
(정보 은닉은 객체지향 설계 원칙 중 하나이다.)
■ 생성자부
[표현법]
public 클래스명(매개변수(생략가능)) {
// 해당 생성자를 통해서 객체 생성시 실행하고자 하는 코드;
}
생성자를 작성하는 목적
1. 객체를 생성해주기 위한 목적
2. 객체 생성 뿐만 아니라 매개변수로 전달된 값을 곧바로 필드에 초기화할 목적
생성자 작성시 주의사항
1. 반드시 클래스명과 동일해야 한다.(대/소문자 구분)
2. 반환형이 존재하지 않는다.(메서드와 비슷하게 생겨서 헷갈릴 수 있다.)
3. 여러개의 생성이 가능하지만 매개변수가 중복되면 안 된다.
4. 매개변수 생성자를 명시적으로 작성하게 되면 기본 생성자를 jvm이 자동으로 만들어주지 않는다.
기본 생성자 == 매개변수가 없는 생성
역할 : 단지 객체 생성만을 목적으로 할 때 사용
기본 생성자 작성하지 않아도 호출하는데 문제가 없다.
jvm이 자동으로 만들어 줬기 때문에 항상 객체 생성이 가능했다.
단, 매개변수가 있는 생성자가 작성되어 있을 때에는 기본 생성자도 반드시 기술해야 한다.
■ 메서드부
[표현법]
접근제한자 예약어(생략가능) 반환할값의자료형 메서드명(매개변수(생략가능)) {
// 실행할 코드;
return 반환할 값;(반환할 자료형이 void인 경우 생략가능)
}
메서드부는 각 기능을 구현하는 부분이다.
한번 정의한 메서드는 얼마든지 다시 호출해서 사용할 수 있다.
즉, 메서드란 실행해야 할 명령어의 집합이다.
1) setter 메서드
해당필드에 대입하고자 하는 값을 전달받아 해당필드에 대입시켜 주는 기능의 메서드
이때, 이 메서드는 접근 가능하도록 해야 하기 때문에 접근제한자는 public을 이용
2) getter 메서드
데이터를 반환해 주는 기능의 메서드
3) this
현재 생성된 객체의 주소값이 담겨있다.
4) 매개변수
해당 메서드 호출 시 전달되는 값을 받아주기 위한 변수 선언문(해당 메서드 안에서만 사용 가능하다)
5) 필드명과 매개변수명이 동일한 경우
필드명과 매개변수 명이 동일한 시점에서 {} 영역 내에 해당 변수를 제시할 시 해당영역 안에서 생성된 변수가 우선순위가 더 높다.
6) void 메서드
void 메서드의 경우 return; 이 jvm이 자동으로 마지막 줄에 생성해 주기 때문에 생략이 가능하다.
■ static 메서드
[표현법]
접근제한자 static 예약어 반환형 메서드명(매개변수) {
// 수행내용;
return;
}
- 호출 시 객체 생성할 필요가 없다.
- 프로그램 시작 시에 정적메모리 영역(static영역)에 메서드가 저장되어 있기 때문이다.
- 클래스명.메서드명(전달값);으로 호출하면 된다.
- 예약어, 매개변수, return 구문(반환형이 없는 경우)는 생략 가능하다.
static 메서드의 특징
- static 메서드 안에서는 static이 아닌 field멤버가 접근이 불가능하다.
- static 메서드는 프로그램 시작 시에 정적메모리 영역에 들어가는데, 이때 static으로 선언된 필드(전역번수)도 함께 정적메모리 영역에 들어갈 것이다.
- 하지만 static으로 선언되지 않은 전역변수는 static메모리에 올라가는 시점에 생성이 되지 않았으므로 사용이 불가능하기 때문에 에러가 발생한다.
■ 메서드 오버로딩
메서드 오버로딩이란
한 클래스 내에 같은 메서드명으로 정의할 수 있는 방법이다.
매개변수의 자료형의 개수, 순서가 다르게 작성되어야만 한다.
단, 매개변수명, 접근제한자, 반환형은 메서드 오버로딩에 영향을 주지 않는다.
public void test(int a, int b) {
}
위와 같은 메서드가 선언되어 있을 때 오류가 나는 경우는 아래와 같다.
1) 매개변수명과는 상관없이 자료형의 개수와 순서가 같아서 에러가 발생한다.
즉, 매개변수의 자료형의 개수와 순서가 다르게 작성되어야 한다.
public void test(int c, int b) {
}
2) 반환형이 다르다고 오버로딩이 적용되지 않는다.
메서드를 호출하는 시점에 매개변수가 동일하기 때문에 에러가 발생한다.
즉, 반환형과 상관없이 매개변수의 자료형의 개수와 순서가 다르게 작성되어야 한다.
public int test(int a, int b) {
}
3) 접근제한자가 다르다고 오버로딩이 적용되지 않는다.
즉, 접근제한자와 상관없이 "매개변수의" 자료형의 개수 및 순서가 다르게 작성되어야 한다.
private void test(int a, int b) {
}
▶ 변수 부분
1) 전역변수 : 클래스 영역에 바로 선언하는 변수 => 클래스 내에 서면 어디서든 사용이 가능하다.
2) 지역변수 : 클래스 영역 내의 어떤 특정한 구역({})에 선언한 변수(선언한 지역에서만 사용 가능)
ex) 메서드, 제어문(if, for) 등등
1. 전역번수(2가지로 구분이 된다)
- 멤버변수 == 인스턴스변수 == 필드
생성시점 : new 연산자를 통해서 해당 객체가 생성하는 순간 메모리 영역에 할당
소멸 시점 : 객체 소멸시 같이 소멸
- 클래스변수 == static 변수 : static이라는 예약어가 붙어 있냐 아니냐에 따라 멤버변수냐 클래스변수냐로 구분
생성시점 : 프로그램 실행과 동시에(해당 객체 생성이 안돼도) 메모리 영역(static 영역)에 할당
소멸시점 : 프로그램이 종료될 때 소멸
2. 지역변수
생성시점 : 특정한 구역({}) 실행(호출)시 메모리 영역에 할당(ex) 메서드 실행 시
소멸시점 : 특정한 구역({}) 종료 시 소멸(ex) 메서드 종료시
'JAVA' 카테고리의 다른 글
JAVA(14) 다형성 (0) | 2023.04.08 |
---|---|
JAVA(13) 객체(Object) (2) (0) | 2023.04.04 |
JAVA(12) 2차원 배열 (0) | 2023.03.31 |
JAVA(11-2) 배열 복사 (0) | 2023.03.30 |
JAVA(11-1) 배열(Array) (0) | 2023.03.29 |