객체지향
객체지향프로그래밍
- 객체(부품)을 만들고 이 객체들을 조립해서 소프트웨어를 만드는 개발방식
- 객체를 만들기 위해선 클래스(설계도)가 필요함
객체지향프로그래밍의 장점
- 코드의 재사용성 높음: 기존의 코드를 이용하여 새코드 작성 가능(상속)
- 코드 관리 용이: 유지보수가 쉬우며 코드의 수정/추가/확장이 간편함(조립, 디자인패턴)
- 신뢰성 높음
- 접근제한자와 메소드를 이용해서 데이터값을 감출 수 있음(캡슐화, 은닉화)
- 코드의 중복 제거 및 코드 불일치로 인한 오작동 방치(리팩토링)
객체지향프로그래밍의 특징
- 캡슐화
- 객체의 구현내용을 감추는 것
- 객체의 내부구조를 알 수 없고 공개된 속성과 기능만 이용 가능
- 잘못된 사용으로 인한 객체 손상 방지
- 상속
- 새로운 객체를 만들때 기존 객체를 이용하는 것
- 상위(부모)클래스, 하위(자식)클래스로 이루어짐
- 상위클래스를 재사용하기때문에 하위클래스 빠르게 개발 가능
- 추상화(다형성)
- 같은 종류의 객체여도 실행결과가 다양하게 나옴
- 사용방법은 동일하지만 사용하는 객체가 바뀌면 실행결과가 달라짐
ex) 컴퓨터의 출력기능. 프린터기에 따라 흑백/컬러 등 결과가 다름
스마트폰에서 소리가 이어폰에서 나오는지, 스피커에서 나오는지에 따라 결과가 다름
객체지향프로그래밍 개발 단계
- 클래스를 설계함
- 클래스로 객체를 생성함
- 생성된 객체의 속성과 기능을 활용함
객체
객체의 정의
- 물리적으로 존재하거나 추상적으로 생각 할 수 있으며, 다른것과 식별이 가능함.
ex) 물리적: 자동차, 책 등
추상적: 주문, 계좌개설 등
- 프로그래밍에서는 프로그래밍 할 대상을 뜻함
- 객체는 각각 고유한 속성과 기능을 갖고 있음
ex1) 자동차
★속성: 제조사, 모델명, 가격 등
☆기능: 출발, 정지, 운전 등
ex2) 주문하기
★속성: 주문번호, 고객명, 주문상태 등
☆기능: 조회, 취소, 반품 등
- 프로그래밍에서는 ★속성=필드 / ☆기능=메서드로 정의함
- 인스턴스화: 메모리 안에 객체를 할당하는 action
- 인스턴스: 메모리 안에 할당된 객체
객체간 관계
- 집합관계(포함관계): 객체가 다른 객체의 부품으로 사용됨
- 사용관계(의존관계): 객체가 다른 객체의 메소드를 호출해서 원하는 작업 수행
- 상속관계
- 부모객체로 자식객체 생성
- 상위 객체는 종류(자동차, 스마트폰)이며, 하위객체는 구체적 모델(제네시스, Galaxy20)
객체의 생성
- new연산자를 이용하여 클래스에 객체를 생성함.
- new연산자는 객체 생성 후 객체의 주소값을 반환하므로, 이를 저장하기 위한 참조 변수가 필요함
클래스명 참조변수;
참조변수 = new 클래스명(); // 이때 new연산자가 주소값을 알아서 생성해서 넣어줌
1.
Car a;
a = new Car();
2.
Car a = new Car();
- 객체는 메모리의 힙(heap)영역에 만들어짐
- 예외적으로 문자열을 표현하는 String은 자주 사용하는 객체이므로 명령어가 더 간단함
1. 원본
String a = new String("홍길동");
2. 간단한 버전
String a = "홍길동"
참조형변수
- 참조형변수는 기본형변수처럼 값이 아닌, 생성된 객체의 주소값을 저장한느 변수
- 참조형변수의 타입은 해당 객체 생성 시 사용한 클래스 이름으로 대체된다
Car myCar = new Car();
Car yourCar;
yourCar = new Car();
- 생성한 객체의 속성과 기능을 사용하기 위해서는 반드시 참조변수를 이용해야함.
- 참조형 변수로 객체 이용하기
1. 설계도 작성
2. 설계도로 객체 작성 후 주소값을 참조변수에 담음
3. 참조변수를 이용하여 객체에 접근
생성된 객체의 속성과 기능 이용
- 참조변수가 참조하지 않는 변수는 객체로 이용 불가
- 생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 참조변수에 객체의 주소값을 저장해야함
Book mybook = new Book(); // 객체 생성
mybook.title = "나미야 잡화점의 기적"; // 객체 속성에 값 저장
mybook.writer = "히가시노게이고"; // 객체 속성에 값 저장
System.out.println(mybook.title); // 객체 속성에 저장된 값 출력
System.out.println(mybook.writer); // 객체 속성에 저장된 값 출력
클래스
클래스의 정의
- 클래스는 객체의 설계도가 됨
- 객체를 생성하기 위한 필드(속성)과 메서드(기능)로 구성
- 클래스에서 만들어진 객체를 인스턴스라고 함.
즉, 인스턴스는 객체이다.
클래스의 설계
Public class 클래스이름{};
Public class Car{}
클래스의 구성
- 하나의 클래스로 여러개의 객체 생성 가능
- 필드, 생성자, 메서드로 구성
1. 필드: 속성을 나타냄. 객체 데이터를 저장
2. 생성자: 객체 생성시 초기화 역할을 해줌
- 메서드: 객체의 기능에 해당하는 수행문의 코드블록
필드
- 객체의 고유 데이터, 상태, 다른 객체를 저장하는 곳
- 초기화값을 지정하지 않으면 데이터타입의 기본값으로 초기화됨
- 객체가 소멸하지 않는 한 함께 유지됨
- 필드 생성 후 값 없이 필드를 찍으면 16진수로 이루어진 객체의 일련번호가 출력됨
객체배열
- 여기서 향상된 for문을 응용해서 쓸 수 있음
참고로 for문에 들어갈 초기식의 타입은 배열과 같아야함
System.out.println(scores[0].name);
System.out.println(scores[1].name);
System.out.println(scores[2].name); // 이 출력값을 아래와 같이 향상된 for문을 이용하여 간결하게 작성 가능
Score scores = new score();
for(int score1 : scores){ // for(데이터타입 변수명 : 배열)
System.out.println(score1.name);
}
선언위치에 따른 변수의 종류
class Car{
int year; // 인스턴스변수
static int milage; // 클래스변수 ★인스턴스변수+클래스변수 = 멤버변수★
void method(){
int a = 30; // 지역변수
}
}
- 인스턴스 변수: 클래스 영역에서 선언되며 인스턴스 생성시 만들어짐. 서로 다른 값을 가질 수 있음.
- 클래스 변수: 인스턴스 변수 앞에 static을 붙인 형태이며 모든 인스턴스가 같은 값을 공유함.
- 지역 변수: 메서드 내에서만 사용 가능하며 메서드가 종료되면 소멸됨. 즉, 블럭을 벗어나면 소멸.