객체
- 프로그램 안에서 필드(데이터, 속성)와 메소드(기능, 동작)을 가진 어떤 역할을 하는 존재
객체 지향 프로그래밍(OOP)
- 여러개의 객체들을 생성하고 객체들을 하나씩 조립해서 프로그램을 완성하는 기법
특징
설명 캡슐화 객체의 필드, 메소드를 하나로 묶고 구현 내용을 외부에 감춤
-> 외부는 객체의 사용 방법만 알고 내부 동작은 모름상속 부모 객체가 자기 필드와 메소드를 자식 객체에 물려줄 수 있음
-> 코드 재사용성 증가, 유지보수 시간 단축다형성 같은 타입이라도 실행 결과가 다양할 수 있음
->상황에 따라 객체가 다양한 형태로 동작 가능객체의 상호작용
- 객체들끼리 서로 메소드를 호출하거나 데이터를 주고받으며 프로그램을 동작
구분 설명 매개값 메소드 호출시, 객체가 전단하는 데이터
메소드의 괄호()안에 기술리턴값 메소드 실행 후 호출한 곳으로 돌려주는 결과값
int result = add(10,20);// 30(리턴값)이 저장됨
클래스
- 객체를 생성하는 설계도
- 클래스 기반으로 여러개의 객체 생성 만들 수 있음
- 구성 요소
구성요소 설명 필드 객체의 데이터를 저장 (변수,속성) 생성자 객체가 생성될 때 초기화를 담당 (리턴 타입 없음, 클래스명과 이름 동일) 메소드 객체가 수행할 동작을 정의 (함수) - 클래스 선언 규칙
- 첫글자 대문자
- CamelCase 표기
- 숫자 o but 첫 문자에는 x
- 특수문자
$,_가능- 종류
- 라이브러리 클래스
실행할 수 없으며 다른 클래스에서 이용하는 클래스- 실행 클래스
main() 메소드르 가지고 있는 실행가능 클래스인스턴스
- 클래스로부터 생성된 객체 = 클래스의 인스턴스
- 인스턴스화 : 클래스로부터 객체를 만드는 과정
- 하나의 클래스는 여러 개의 인스턴스를 만들 수 있음
필드
- 객체의 데이터 저장
- 고유 데이터, 상태 데이터, 부품 데이터
필드 선언
타입 필드명(=초기값);
- 초기값 설정안하면 기본값으로 초기화
- new 연산자
클래스 변수명 = new 클래스()
- 객체를 생성후 생성자를 호출해서 객체 초기화
- 객체를 생성해서 객체의 주소를 반환
기본 생성자
public 클래스명(){};
- 생성자 선언이 없으면 컴퍼일러가 기본 생성자를 자동으로 추가
- 선언된 생성자가 있으면 기본생성자 추가 X
생성자 선언
클래스명(매개변수,...){ //객체의 초기화 코드 }
- 다양하게 초기화하기 위해 생성자를 직접 선언할 수 있음
- 메소드와 비슷한 선언을 하지만 리턴 타입 X, 클래스명과 동일
- 필드 초기화
this키워드 이용해서 지역변수를 가져옴public class Car{ //필드 선언 String model; int price; int maxSpeed; //생성자 생성 public Car(String model, int price, int maxSpeed){ this.model = model; this.price = price; this.maxSpeed = maxSpeed; } }생성자 오버로딩
- 매개변수의 타입, 개수, 순서를 다르게 여러 개의 생성자 선언
Car(){} Car(String model){} Car(String model, int price){} Car(String model, int price, int maxSpeed){}
- new 연산자로 생성자 호출할때 제공된 매개 값의 타입, 수에 따라 실행될 생성자 결정
다른 생성자 호출
- 생성자 오버로딩이 많아 질 경우 중복 코드 발생 가능
this()를 이용해 공통 코드 호출Car(String model){ this(model,5000,150); } Car(String model, int price){ this(model,price,150); } Car(String model, int price, int maxSpeed){ this.model = model; this.price = price; this.maxSpeed = maxSpeed; }
리턴타입 메소드명 (매개변수,...){ //실행할 코드 }
- 객체의 동작을 실행 블록으로 정의
메소드 호출
클래스변수.메소드명(매개변수)로 호출가변길이 매개변수
- 매개변수의 개수와 상관없이 매개값을 줄 수 있음
int sum(int...values){ // 합성값 return result; }int result = sum(1,2,3); int[] values = {1,2,3,4}; int result = sum(values); int result = sum(new int[] {1,2,3,4,5,6};메소드 오버로딩
- 메소드 이름은 같지만 매개변수의 타입, 개수, 순서가 다른 메소드를 여러개 선언
this 키워드 : public class Car {
String model;
Car(String model) {
this.model = model; // 필드(model)과 매개변수(model)를 구분
}
}static 키워드를 추가해 정적 필드와 정적 메소드 선언. 연산자로 접근클래스이름.필드명, 클래스이름.메소드명(매개변수...)public class Calculator{
static double pi = 3.141592;
}public class Cal{
public static void main(String[] args){
double result1 = 10 * 10 * Calculator.pi;
}
}final 타입 필드명 (=초기값);
한 번 초기화되면 프로그램 실행 중 값이 변경될 수 없음
반드시 초기화되어야 함!
초기화 방법
public class Person {
final String nation = "Korea"; // 선언 시 초기화
final String ssn;
Person(String ssn) {
this.ssn = ssn; // 생성자에서 초기화
}
}
package 키워드를 사용하여 소스 파일의 최상단에 선언com.google.search)import문을 사용해 해당 클래스를 불러와야함
public,protected,privated- 중요한 필드와 메소드가 외부에 노출되지 않도록 객체의 무결성을 유지하기 위해 접근 제한자 사용
![]()
접근 제한자 제한 대상 제한 범위 public 클래스, 필드, 생성자, 메소드 없음 protected 필드, 생성자, 메소드 같은 패키지이거나, 자식 객체만 사용 가능 (7장 상속에서 자세히 설명) (default) 클래스, 필드, 생성자, 메소드 같은 패키지
접근 제어자를 생략했을때 -> 다른 패키지에서 사용 불가private 필드, 생성자, 메소드 객체 내부
private 타입 fieldName;
// Getter
public 타입 getFieldName() {
return fieldName;
}
// Setter
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
Alt + Insert
isXxxx()로 지정하는 것이 관례public class Singleton {
// 1. 자기 자신 타입의 static 필드를 선언하고 객체를 생성
private static Singleton instance = new Singleton();
// 2. 생성자를 private으로 선언 (외부에서 new 사용 금지)
private Singleton() {}
// 3. public 메소드로 인스턴스를 제공
public static Singleton getInstance() {
return instance;
}
}
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
System.out.println(obj1 == obj2); // true (같은 객체)