반응형
객체지향 프로그래밍
부품에 해당하는 객체들을 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법
객체
- 모든 인스턴스를 대표하는 포괄적인 의미
- 클래스의 타입으로 선언되었을 때 객체라고 부름
- 메모리 할당 되지 않은 상태
- 객체 : 필드(속성), 메소드(동작) 으로 구성
- 객체 모델링 : 현실 세계의 객체를 소프트웨어 객체로 설계하는 것
객체 간의 관계 (집합 관계, 사용 관계, 상속 관계)
객체지향 프로그래밍의 특징
- 캡슐화 : 필드와 메소드 보호, 접근 제한자 사용
- 상속 : 코드의 재사용성, 유지 보수 시간 최소화 (부모 객체의 필드와 메소드를 수정하면 자식 객체들은 자동으로 수정됨)
- 다형성 : 자동 타입 변환과 재정의, 상속, 인터페이스 구현
객체와 클래스
- 클래스 : 객체 생성의 설계도
- 인스턴스
- 클래스로부터 생성된 객체
- 메모리에 할당됨
- 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부름
객체 생성과 클래스 변수
- 객체 생성 → new 연산자 사용
- new 연산자로 생성된 객체는 메모리힙(heap) 영역에 생성
- 스택 영역에 생성된 클래스 변수가 힙 영역에 생성된 객체의 주소를 참조
/* 클래스 */
public class Animal {
...
}
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // '객체'
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
클래스의 두 가지 용도
|
클래스의 구성 멤버
- 필드(Field) : 객체의 데이터 저장
- 생성자(Constructor) : 객체 생성 시 초기화 담당
- 메소드(Method) : 객체의 동작으로 호출 시 실행하는 블록
필드
객체의 데이터를 저장하는곳 → 객체가 만들어졌을때 항상 그 객체안에 존재
- 필드는 초기값을 주지 않아도 선언 할 수 있음 → 자동으로 기본 초기값이 적용됨
- 정수, 실수타입 → 0
- 논리타입 → false
- 참조타입 → null
필드 사용
- 클래스 내부에서는 단순히 필드 이름을 읽고 변경하면되지만, 클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야함
public class CarExample {
public static void main(String[] arg) {
//객체생성
Car myCar = new Car(); //Car라는 클래스 타입의 변수 myCar선언, new 연산자로 Car();라는 객체 생성
//필드값 읽기
System.out.println("제작회사:" + myCar.company);
System.out.println("모델명:" + myCar.model);
System.out.println("색상:" + myCar.color);
System.out.println("최고속도:" + myCar.maxSpeed);
System.out.println("현재속도:" + myCar.speed);
//필드값 변경
myCar.speed = 60;
System.out.println("수정된 속도:" + myCar.speed);
}
}
생성자 선언과 호출
- 생성자 : new연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당
- 모든 클래스에는 생성자가 반드시 존재, 생성자를 하나 이상 가질 수 있음
- 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본생성자를 바이트 코드에 자동 추가함
- 클래스에 명시적으로 선언한 생성자가 1개라도 있으면 컴파일러는 기본 생성자를 추가하지 않음
생성자 선언
- 매개변수 선언은 생략할 수도 있고 여러개를 선언할 수도 있음
- 클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객체를 생성해야만 함
public class Car {
//생성자
Car(String model, String color, int maxSpeed) {...}
}
필드 초기화
- 객체마다 동일한 값을 갖고 있다면 필드 선언 시 초기값을 대입하는 것이 좋음
- 객체마다 다른 값을 가져야 한다면 생성자에서 필드르 초기화 하는 것이 좋음
생성자 오버로딩
- 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
- 매개 변수의 타입, 개수, 순서가 다르게 선언
public class Car {
Car(){...}
Car(String model){...}
Car(String model, String color){...}
Car(String model, String color, int maxSpeed){...}
}
//다양한 객체 생성가능
Car car1 = new Car();
Car car2 = new Car("그랜저");
Car car3 = new Car("그랜저","흰색");
Car car4 = new Car("그랜저","흰색",300);
다른 생성자 호출 : this()
- this()는 자신의 다른 생성자를 호출하는 코드, 반드시 생성자의 첫줄에서만 허용
Car(String model) {
this (model,"은색", 250); // 공통 실행코드 호출
/*
this.model = model;
this.color = "은색";
this.maxSpeed = 250;
*/
}
Car(String model, String color) {
this (model,color,250); // 공통 실행코드 호출
/*
this.model = model;
this.color = color;
this.maxSpeed = 250;
*/
}
Car(String model, String color, int maxSpeed) { //공통 실행코드 작성
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
메소드 선언
선언부, 실행블록으로 구성
- 리턴 타입 : 메소드가 리턴하는 결과값의 타입 표시, 리턴값이 없을경우 void로 기술함
- 메소드 이름 : 메소드 기능이 드러나도록 이름을 지어줘야함 (소문자로 시작, 캐멀 스타일로 작성)
- 매개 변수 선언 : 메소드를 실행 할 때 필요한 데이터를 받기 위한 변수를 선언 (없거나 하나이상)
- 메소드 실행 블록 : 실행할 코드 작성
메소드 호출
- 객체 내부에서 호출 : 메소드 이름만으로도 호출가능
public class ClassName {
void method1(String p1, int p2) {}
void method2 {
method1("홍길동", 100);
}
}
- 객체 외부에서 호출 : 객체 생성 후 도트 연산자(.)를 통해 메소드 호출
Car myCar = new Car();
myCar.keyTurnOn(); //리턴값이 없음
myCar.run; //리턴값이 없음
int speed = myCar.getSpeed(); //리턴값이 int
가변길이 매개변수
- 매개변수를 배열타입으로 선언 → int[] 배열객체 변수명, int… 배열객체 변수명
리턴(return)문
- 리턴값이 있는 메소드 : 메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야함, 리턴문이 없을경우 컴파일에러 발생, 리턴문이 실행되면 메소드는 즉시 종료
int plus(int x, int y) {
int result = x + y;
return result;
}
- 리턴값이 없는 메소드 : void타입 메소드에 리턴문 사용시 메소드 실행을 강제 종료시킴
void run() {
while(true) {
if(gas > 0) {
System.out.println("달립니다.");
} else {
System.out.println("멈춥니다.");
return; // run()메소드 종료
//while문만 종료해야할 경우엔 break; 사용
}
}
}
메소드 오버로딩
- 매개변수의 타입, 개수, 순서 중 하나가 달라야함
- println() 메소드 (메소드 오버로딩의 가장 대표적인 예) : 주어진 매개값의 타입에 따라서 오버로딩된 메소드중 하나를 호출함
void println() {...}
void println(boolean x) {...}
void println(char x) {...}
void println(char[] x) {...}
void println(double x) {...}
void println(float x) {...}
void println(int x) {...}
void println(long x) {...}
void println(Object x) {...}
void println(String x) {...}
반응형
댓글