JAVA 공부 3일차
객체지향 Part. 1 (클래스,객체,인스턴스,메서드,static,오버로딩,초기화 등)
1) 객체 지향과 절차 지향
ㄱ. 객체지향과 절차지향
- 절차지향 : 대표적으로 C언어가 있으며 위에서 아래로 순차적으로 처리, 프로그램 전체가 유기적으로 연결되어 있으며, 빠른 처리시간이 장점이다. 유지보수, 디버깅, 실행순서 변경으로 인한 동일한 결과 미보장 등이 단점이다.
- 객체지향 : 데이터와 절차를 하나의 덩어리로 묶어서 진행한다. 특징으로는 캡슐화, 상속, 다형성이 있다. 코드의 재활용성이 높고, 코딩이 간편하며 디버깅이 쉽지만 처리속도가 느리고 설계에 시간이 많이 필요하다.
2) 클래스, 객체, 인스턴스, 변수, 메서드
ㄱ. 클래스와 객체
정의 | 용도 | 예시 | |
클래스(class) | 객체를 정의해 놓은것 | 객체를 생성 | 붕어빵 기계 |
객체(Object) | 실제로 존재 하는 것, 모든 인스턴스를 대표하는 용어 |
객체가 가지는 속성과 기능에 따라 다름 | 붕어빵 |
인스턴스(Instance) | 특정 클래스로부터 생성된 객체 | 메모리의 일부를 가리킴 | 팥붕어빵, 슈크림 붕어빵 |
ㄴ. 변수의 종류
- 클래스 변수 : 클래스가 메모리에 올라갈 때 생성, 객체 생성에 상관없이 언제든 사용 가능
- 인스턴스 변수 : 객체가 생성될 때 생성, 참조변수명이나 인스턴스 변수명을 통해 접근 가능
- 지역 변수 : 메서드가 실행될 때 생성되며 메서드 종료 시 자동으로 제거
ㄷ. 매개변수(Parameter)와 종류
- 매개변수 : 함수의 정의부분에 나열되어 있는 변수들을 의미, funtion sum(int x, inx y) 에서 x, y
- 전달인자(argument) : 함수를 호출할 때 전달되는 실제 값, return
- 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. ex) x = 1000;
- 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. ex) method.x = 1000;
ㄹ. 메서드(method)
- 메서드 : 특정 작업을 수행하는 일련의 문장을 하나로 묶은 것, 함수와 유사. Math.random()에서 random()이 메서드
- 장점 : 중복 코드 제거(가독성 및 효율 증가), 관리 용이, 재사용 가능
3)static, 오버로딩, 생성자, this와 this(), 변수의 초기화
ㄱ. static 매서드
- 객체 생성없이 호출
- 인스턴스멤버(인스턴스변수,인스턴스메서드)와 관련없는 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수 사용 불가
- ex)Math.random()
ㄴ. 인스턴스 매서드
- 인스턴스 생성 후 참조변수.메서드이름()으로 호출
- 인스턴스멤버와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수 사용 가능
ㄷ. 오버로딩
- 한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것
- 성립 조건
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입, 위치가 달라야한다.
- 반환타입에는 영향을 받지 않는다.
- 사용 예시
class Overloading8_1 {
int add(int a, int b) {
System.out.println("int add(int a, int b)");
return a + b;
}
// void add(int a, int b) { // 반환 타입이 다르다고 오버로딩이 성립되지는 않음
// System.out.println("void add(int a, int b)");
// System.out.println("a + b = " + a + b);
// }
long add(long a, long b) {
System.out.println("long add(long a, long b)");
return a + b;
}
long add(long a, int b) {
System.out.println("long add(long a, int b)");
return a + b;
}
long add(int a, long b) {
System.out.println("long add(int a, long b)");
return a + b;
}
}
ㄹ. 생성자
- 인스턴스가 생설될 때 마다 호출되는 '인스턴스 초기화 메서드'
- 성립 조건
- 이름이 클래스 이름과 같아야.
- return 값이 없다.
- void는 붙이지 않는다.
- 오버로딩 가능
- 기본 생성자
- 매개변수가 없는 생성자를 의미
- 생성자를 하나도 선언되어 있지 않았을 때 는 컴파일러가 자동으로 추가해준다.
- 사용 예시
class Tv9_1 {
// 속성 : 변수 선언
boolean power; // 전원상태
int channel; // 채널
String color; // 색깔
long price; // 가격
// 위 속성에서 필수로 초기값이 필요한 값들을 초기화 해주는 기본 생성자
public Tv9_1() {
power = false;
channel = 1;
}
// 오버로딩 한 생성자 - 매장 진열 용 일 경우에는 가격과 색깔의 초기화가 필요합니다. this 는 이전 챕터에서 잠깐 봤었죠! 매개변수와 인스턴스변수를 구분하기 위해 사용하겠습니다.
public Tv9_1(String color, long price) {
power = false; // this.power, power 둘다 지금 상황에서는 인스턴스 변수를 명확하게 판단 할 수 있기 때문에 어떤걸 사용해도 상관 없습니다.
channel = 1;
this.color = color;
this.price = price;
}
}
ㅁ. this 와 this()
- this
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스 메서드(생성자 포함) 에서 사용 가능
- 지역 변수와 인스턴스 변수를 구별할 때 사용
- 오버로딩 가능
- this()
- 생성자에서 다른 생성자를 호출할 때 사용
- this()를 사용하지 않고 클래스명(); 으로 하면 Error발생
- 다른 생성자 호출 시 첫 줄에서만 사용 가능
ㅂ. 변수의 초기화
- 지역 변수는 수동으로 초기화 해야한다.
- 지역 변수가 동작하는 스택 메모리는 재사용이 빈번하기에 매번 초기화하면 성능이 저하
- 그래서 덮어 씌운다.
- 근데 해당 주소에 어떤 값이 있는지 모르게 때문에 java는 개발자에게 수동으로 초기화 요구
- C언어에서는 garbage value라 부름
- 멤버변수(인스턴스 변수, 클래스 변수)는 자동으로 초기화
- 클래스 변수 : 클래스가 처음 로딩될 때 단 한번만 초기화
- 인스턴스 변수 : 인스턴스가 생성될 때 마다 초기화 된다.
- 명시적 초기화
class Tv11_1 {
boolean power = false; // 기본형 변수의 초기화
int channel = 1; // 기본형 변수의 초기화
Audio audi = new Audio(); // 참조형 변수의 초기화, 참조형은 객체주소 or null 로 초기화!!
// 참조형의 기본값은 null 입니다!!
...
}
- 초기화 블럭
class Tv11_2 {
static boolean power;
int channel;
// 클래스 초기화 블럭
static
{
power = false;
}
// 인스턴스 초기화 블럭
{
channel = 1;
}
...
}
- 생성자 초기화
class Tv11_3 {
// 속성 : 변수 선언
boolean power; // 전원상태
int channel; // 채널
String color; // 색깔
long price; // 가격
// 위 속성에서 필수로 초기값이 필요한 값들을 초기화 해주는 기본 생성자
Tv11_3() {
this.power = false;
this.channel = 1;
}
...
}
3)참고 자료
ㄱ. 절차지향과 객체지향의 차이와 각각의 장단점
https://brownbears.tistory.com/407
ㄴ. 메모리의 구조 (코드영역, 데이터 영역, 힙 영역, 스택 영역)
http://www.tcpschool.com/c/c_memory_structure
ㄷ. Flowchart 쉽게 그릴 수 있는 사이트