반응형
- 객체란? 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것.
- 속성과 동작으로 구성.
- 사람은 이름, 나이 등의 속성 + 웃다, 걷다 등의 동작
- 속성: 필드, 동작: 메소드
- 객체 모델링: 현실 세계의 객체를 소프트웨어 객체로 설계하는 것
- 객체의 상호작용: 객체들은 각각 독립적으로 존재, 다른 객체와 서로 상호작용하며 동작
- 메소드: 객체들 사이의 상호작용 수단
- 메소드 호출: 객체가 다른 객체의 기능을 이용
- 도트 연산자: 객체의 필드와 메소드에 접근할 때 필요
- 객체 지향 프로그래밍: 만들고자하는 완성품인 객체를 모델링, 집합 관계에 있는 부품 객체와 사용관계에 있는 객체를 하나씩 설계한 후 조립
- 객체 지향 프로그래밍의 특징
- 캡슐화(Encapsulation): 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것
- 외부 객체는 객체 내부 구조를 알지 못하고, 객체가 노출해서 제공하는 필드와 메소드만 이용 가능
- 보호 이유: 외부의 잘못된 사용으로 인해 객체 손상되지 않도록
- 접근 제한자: 캡슐화된 멤버 노출시키거나 숨길지 결정
- 상속(Inheritance): 상위 객체의 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 함
- 다형성(Polymorphism): 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
- 부모 클래스 또는 인터페이스의 타입 변환 허용
- 부모 타입에는 모든 자식 객체 대입 가능, 인터페이스 타입에는 모든 구현 객체 대입 가능
- ex) 자동차는 타이어 타입으로 한국 타이어, 금호를 이용하지만 각 타이어의 성능은 다름
- 캡슐화(Encapsulation): 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것
- 객체와 클래스
- 자동차를 만들 때 설계도를 보고 만들듯, 객체 지향 프로그래밍에서도 설계도(Class)로 해당 객체를 만들어야함.
- 클래스에는 객체를 생성하기 위한 필드와 메소드 정의되어 있음.
- 인스턴스(instance): 클래스로부터 만들어진 객체
- 인스턴스화: 클래스로부터 객체를 만드는 과정
- 하나의 클래스로부터 여러 개의 인스턴스 만들 수 있음.
- 객체 지향 프로그래밍 개발의 세 가지 단계
- 1. 클래스 설계
- 2. 설계된 클래스를 가지고 사용할 객체 생성
- 3. 생성된 객체 이용
- 클래스 선언: 소스 파일은 클래스 선언을 담고 있는 저장 단위. 클래스 자체가 아님
- 소스 파일에 두개 이상의 클래스를 선언하는 것도 가능하나 public 접근 제한자는 파일 이름과 동일한 이름의 클래스 선언에만 붙일 수 있다.
- 가급적 소스 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋음
- 객체 생성, 클래스 변수
- new 클래스(); 로 객체 생성.
- new는 클래스로부터 객체 생성하는 연산자
- 클래스(): new 연산자 뒤에 오는 생성자 -> 메모리 힙 영역에 생성됨
- new 연산자는 힙 영역에 객체 생성 시킨 후, 객체의 주소를 리턴. 이 주소를 참조 타입인 클래스 변수에 저장해두고 객체 사용.
- 클래스 변수;
- 변수 = new 클래스();
- Student 클래스는 하나이지만 new 연산자를 사용한 만큼 객체가 메모리에 생성됨. 이러한 객체들은 Student 클래스의 인스턴스.
- 같은 클래스로부터 생성되었지만 각 객체는 고유 데이터 가지며 메모리에서 활동. s1, s2가 참조하는 Student 객체는 완전히 독립된 서로 다른 객체
- 클래스의 두가지 용도
- 1. 라이브러리(API: Application Program Interface): 다른 클래스에서 이용할 목적으로 설계됨
- 2. 실행용
- 프로그램 전체 클래스 100개라면 99개 라이브러리, 1개 실행 클래스 (main()메소드 제공역할)
- 위의 예제에서 Student는 라이브러리 클래스, StudentExample은 실행 클래스
- Student에 메인 메소드를 작성해서 라이브러리인 동시에 실행 클래스로 만들 수 있으나 객체 지향 프로그램은 대부분 라이브러리와 실행 클래스 분맇ㅁ.
- 클래스의 구성 멤버: 필드, 생성자, 메소드
- 필드: 객체의 데이터가 저장되는 곳.
- 변수와의 차이: 변수는 생성자와 메소드 내에서만 사용, 생성자와 메소드가 실행 종료되면 자동 소멸. 필드는 생성자와 메소드 전체에서 사용, 객체가 생성되지 않는 한 객체와 함께 존재
- ex_ int fieldName;
- 생성자: 객체 생성 시 초기화 역할 담당. 필드 초기화 하거나 메소드 호출해서 객체 사용할 준비함
- ex_ ClassName() { ... }
- 메소드: 객체의 동작에 해당하는 실행 블록
- ex_ void methodName() { ... }
- 필드: 객체의 데이터가 저장되는 곳.
- 필드
- 객체의 고유 데이터, 부품, 상태 데이터 저장.
- 필드 선언: 생성자 선언과 메소드 선언의 앞과 뒤에 가능
- 클래스 외부에서 사용할 경우 클래스로부터 객체를 생성한 뒤 필드 사용해야함
- why? 필드는 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않음
- 생성자: new랑 같이 사용. 클래스로부터 객체 생성할 때 호출되어 객체의 초기화 담당(필드 초기화 or메소드 호출해서 객체 사용할 때 준비)
- 기본 생성자: 모든 클래스에 하나의 생성자 존재. 생략시 기본 생성자 컴파일러가 자동 추가
- 생성자 오버로딩: 다양한 방법으로 객체 생성 가능. 매개변수를 달리하는 생성자 여러개 선언
- 매개값의 타입과 수에 의해 호출될 생성자 결정
- 생성자 오버로딩 많으면 중복 코드 많아진다. 필드 초기화 내용은 한 생성자에만 집중 작성, 나머지 생성자는 초기화 내용 가진 생성자 호출! this 사용해서 호출한다.
- this()는 자신의 다른 생성자 호출하는 코드. 생성자의 첫줄에서만 허용.
- this()의 매개값은 호출되는 생성자의 매개변수 타입에 맞게 제공. this() 다음에 추가적인 실행문 올 수 있다. 호출되는 생성자의 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문 진행
package chap06;
public class Car {
//field
String company = "현대";
String model;
String color;
int maxSpeed;
//생성자
Car(){
}
Car(String model){
this(model,"은색",250); //맨 마지막 생성자 호출
}
Car(String model,String color){
this(model,color,250);
}
Car(String model,String color,int maxSpeed){
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
- 메소드: 객체의 동작에 해당하는 중괄호 {} 블록.
- 필드 읽고 수정하는 역할
- 다른 객체 생성해서 다양한 기능 수행
- 객체간 데이터 전달의 수단 - 외부로부터 매개값 받을 수도, 실행 후 어떤 값 리턴할 수도 있다
- 메소드 선언: 선언부(리턴타입, 메소드이름, 매개변수 선언) / 실행블록
- 매개 변수의 수를 모를 경우: 매개 변수를 배열 타입으로 선언 / int ... values로 선언
package chap06;
//매개변수의 수를 모를 경우
public class Computer {
int sum1(int[] values) {
int sum=0;
for(int i=0;i<values.length;i++) {
sum+= values[i];
}
return sum;
}
int sum2(int ...values) {
int sum=0;
for(int i=0;i<values.length;i++) {
sum+= values[i];
}
return sum;
}
}
package chap06;
//ComputerExample.java
public class ComputerExample {
public static void main(String[] args) {
Computer myCom = new Computer();
int[] values1 = {1,2,3};
int result1 = myCom.sum1(values1);
System.out.println("result1: "+result1);
int result2 = myCom.sum1(new int[] {1,2,3,4,5});
System.out.println("result2: "+result2);
int result3 = myCom.sum2(1,2,3);
System.out.println("result3: "+result3);
int result4 = myCom.sum2(1,2,3,4,5);
System.out.println("result4: "+result4);
}
}
- 인스턴스 멤버: 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드
- 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this 사용 가능
- 정적 멤버
- 정적 필드 : static 타입 필드 [=초기값];
- 정적 메소드 : static 리턴 타입 메소드 (매개변수 선언, ...) { ... }
- 정적메소드 선언시 객체 없어도 실행되므로 내부에 인스턴스 필드, 메소드 사용 불가 / this 불가
- 싱글톤: 전체 프로그램에서 단 하나의 객체만 만들도록 보장
- 클래스 외부에서 new연산자로 생성자 호출할 수 없도록 막아야함
- 생성자에 private, 정적필드 하나 선언하고 자신의 객체 생성해 초기화, 정적 필드도 private 접근 제한자 붙임
package chap06;
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {}
static Singleton getInstance() {
return singleton;
}
}
package chap06;
public class SingletonExample {
public static void main(String[] args) {
/*
* Singleton obj1 = new Singleton(); //컴파일 에러
* Singleton obj2 = new Singleton(); //컴파일 에러
* */
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if(obj1 == obj2) {
System.out.println("같은 싱글톤 객체입니다.");
}else {
System.out.println("다른 싱글톤 객체입니다.");
}
}
}
- final 필드와 상수
- final 은 초기값이 저장되면 이게 최종값이 되어 프로그램 실행 도중 수정불가
- 상수는 불변의 값.
- final 필드도 변경할 수 없지만 상수는 아님. 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띄며 여러 값으로 초기화 불가. 상수는 static이며 final이어야한다. static final필드는 객체마다 저장되지 않고 클래스에만 포함되며 한번 초기값이 저장되면 변경할 수 없다.
- 접근 제한자
접근 제한 | 적용 대상 | 접근할 수 없는 클래스 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
default | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스 |
private | 필드, 생성자, 메소드 | 모든 외부 클래스 |
반응형
'코딩기록 > 자바' 카테고리의 다른 글
자바 정렬 방법 (0) | 2023.03.17 |
---|---|
[자바의 정석] 클래스 멤버 변수, 인스턴스 멤버 변수 구분하기 (0) | 2023.03.09 |
[이것이 자바다] Ch5. 참조타입 (0) | 2023.01.20 |
[이것이 자바다] Ch4. 조건문과 반복문 (0) | 2023.01.17 |
[이것이 자바다] Ch3. 연산자 (0) | 2023.01.17 |