장점
단점
절차 지향 프로그래밍은 명령어의 흐름(순서)에 초점을 두고 있는 패러다임으로서 데이터와 함수를 명시적으로 분리한다.
장점
단점
캡슐화의 격리 구조 때문에 실행 속도가 느리다.
객체 단위의 구성은 메모리 소모가 크다.
왜 태어났을까 ?
객체 지향 프로그래밍은 대규모 소프트웨어 개발 프로젝트에서의 필요성에 부응하기 위해 개발. 이전의 절차 지향적인 접근은 대규모 시스템에서의 복잡성을 다루기 어려웠으며, 객체 지향 프로그래밍은 이러한 복잡성을 더 효과적으로 다룰 수 있도록 도움을 주었습니다.
변수 -> 배열 -> 구조체 -> 클래스
1. 변수 : **하나의 데이터**를 저장할 수 있는 공간
2. 배열 : **같은 종류의 데이터를 하나의 집합**으로 저장할 수 있는 공간 (크기 고정)
3. 구조체 : **여러 데이터를 종류에 상관없이** 하나의 집합으로 저장할 수 있는 공간
4. 클래스 : **데이터와 함수의 결합**
인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다. (하지만 void를 붙이지는 않는다)
new 연산자가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것은 아니다.
MyClass A = new MyClass();
// 1. 연산자 new에 의해 Heap 메모리에 MyClass의 인스턴스가 생성된다.
// 2. 생성자가 호출
// 3. 생성된 인스턴스의 주소가 반환되어 참조변수에 저장 (new의 역할)
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능
- 생성자 내부에서 다른 생성자 호출 시 클래스 이름이 아닌 this()를 사용한다.
- 한 생성자에서 다른 생성자 호출 시 첫줄에서만 호출 가능 !!!!!
- 어길 시 컴파일 에러
- 왜 첫줄이어야 할까?
중간에 호출할 경우 이전의 초기화 작업이 무로 돌아갈 수 있기 때문에 !
// 올바른 예
class Node{
int x;
int y;
Node(int x,int y){
this.x = x;
this.y = y;
}
Node(){
this(1,2);
}
}
class Node{
int x;
int y;
Node(int x,int y){
this.x = x;
this.y = y;
}
}
JAVA언어에서는 변수,함수가 클래스 바깥에 존재할 수 없다 !
class 변수{
int 인스턴스_변수;
static int 클래스_변수; // 클래스 영역
void 함수(){
int 지역_변수; // 메소드 영역
}
}
비교
변수의 종류 | 선언위치 | 생성 시기 |
---|---|---|
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 클래스 영역 | 인스턴스가 생성되었을 때 |
지역 변수 | 클래스 영역 이외의 영역 | 변수가 선언된 코드가 수행될 때 |
인스턴스 변수
클래스 변수
지역_변수
순서
기본값 -> 명시적 초기화 -> 블럭 -> 생성자
// 선언부
int method(int x,int y){
return x + y; // 구현부 (반환타입과 일치하거나 자동 형변환이 가능한 것)
}
오버로딩 조건
반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
class MyMath{
int sum(int x,int y){
return x + y;
}
double sum(int x,int y){
return x + y;
} // sum(int, int)' is already defined in 'MyMath'
}
long add(int a,long b);
long add(long a,int b);
오버로딩 장점
JDK1.5에서부터 매개변수 개수를 동적으로 지정할 수 있는 가변인자가 추가되었다.
- 타입… 변수명으로 사용
- 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다. (어길경우 에러가 발생)
- 가변인자는 내부적으로 배열을 사용
- 메서드 내부에서는 가변인자를 배열로 선언
int sum(int... num){}