세상에 존재하는 물체를 뜻하며 식별이 가능한 것
예) 자동차, 도서관, 계산기, 강의, 배달 주문, 운동(개념또한 포함)
Java 에서는 이러한 속성과 행위를 필드와 메서드로 정의하여 구현한다
이처럼 현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것을 ‘객체 모델링’이라고 부른다
현실세계에서의 객체는 수많은 관계를 맺고 살아간다
소프트웨의 객체도 마찬가지다
자동차 객체를 통해 살펴보자
사람이 자동차를 사용한다
자동차에는 타이어, 차문, 핸들 등의 부품이 필요하다
자동차와 기차 객체는 하나의 공통된 기계 시스템 객체를 토대로 만들어진다
속성(필드)와 행위(메서드)를 하나로 묶어 객체로 만든 후 실제 내부 구현 내용은 외부에서 알 수 없게 감추는 것
기존의 객체(부모객체)를 재사용해서 새로운 객체(자식객체)를 작성하는것
[상속하는 이유]
객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러가지 형태로 재구성되는 것
객체에서 공통된 부분들을 모아 상위 개념으로 새롭게 선언하는 것
public class Car {}
String company; // 자동차 회사
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
public Car() {}
double gasPedal(double kmh) {
speed = kmh;
return speed;
}
new Car(); // Car클래스 객체 생성
new
뒤에 클래스()
를 붙여 객체 생성Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
new
연산자를 통해서 객체가 생성되면 해당 인스턴스의 주소가 반환되기 때문에 해당 클래스의 참조형 변수를 사용객체는 참조형 변수와 동일하게 취급되기 때문에 배열 또는 컬렉션에도 저장하여 관리 가능
Car[] carArray = new Car[3];
필드는 객체의 데이터를 저장하는 역할
필드들은 초기화안하면 객체 생성시 자동으로 기본값으로 초기화됨
String model = "Gv80";
[필드 타입별 기본값]
데이터타입 | 기본갑 |
---|---|
byte, short, int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | \u0000(공백) |
boolean | false |
배열, 클래스, 인터페이스 | null |
Car car = new Car();
car.color = "blue";
double brakePedal() {
speed = 0;
return speed;
}
리턴타입 메서드명(매개변수, ...) {
실행할 코드 작성
}
메서드가 실행된 후 호출을 한 곳으로 값을 반환할 때 해당 값의 타입
double brakePedal() {...} // double 타입 반환
char changeGear(char type) {...} // char 타입 반환
boolean onOffLights() {...} // boolean 타입 반환
void horn() {...} // 반환할 값 없음
return 리턴타입의 반환값;
메서드를 호출할 때 메서드로 전달하려는 값을 받기 위해 사용되는 변수
double gasPedal(double kmh, char type) {
speed = kmh;
return speed;
}
(double kmh, char type)
요놈들이 매개변수gasPedal(100, 'D');
이렇게 순서와 타입에 맞게 쓰면됨(double ... speeds)
(10, 20, 30)
Car car = new Car();
car.gasPedal(100, 'D');
double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
double speed = car.gasPedal(100, 'D');
한 클래스 내에 동일한 이름의 메소드를 매개변수의 개수, 타입, 순서를 달리하여 여러 개 정의하는 것
println()
printlnInt()
, printlnDouble()
처럼 메서드명이 길어지고 낭비 되었을 것메소드를 호출할 때 전달할 매개값으로 지정한 값을 메소드의 매개변수에 복사해서 전달
메소드를 호출할 때 전달할 매개값으로 지정한 값의 주소를 매개변수에 복사해서 전달
📌 맴버 = 필드 + 메소드
- 인스턴스 멤버 = 인스턴스 필드 + 인스턴스 메소드
- 클래스 멤버 = 클래스 필드 + 클래스 메소드
객체를 생성해서 사용 가능
객체를 생성없이도 사용 가능
static
키워드 사용해서 생성메서드 내부에 선언한 변수
final String company = "GENESIS";
Car car = new Car();
System.out.println(car.company);
static final String COMPANY = "GENESIS";
System.out.println(Car.COMPANY);
객체가 생성될 때 호출되며 객체를 초기화하는 역할 수행
public Car() {} // 선언
Car car = new Car(); // 호출
Car();
생성자 호출선언할 때 괄호( ) 안에 아무것도 넣지않는 생성자
생성자를 통해 필드를 초기화 할 때 오버로딩을 적용 가능
🚨 주의사항
오버로딩을 할 때 개수, 타입, 순서가 동일한데 매개변수명만 다르게 하는 경우는 오버로딩 규칙에 위배되기 때문에 오류가 발생하니 주의!
this는 객체 즉, 인스턴스 자신을 표현하는 키워드
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
Car returnInstance() {
return this;
}
this(…)는 객체 즉, 인스턴스 자신의 생성자를 호출하는 키워드
public Car(String model) {
this(model, "Blue", 50000000);
}
public Car(String model, String color) {
this(model, color, 100000000);
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
🚨 주의사항
this() 키워드를 사용해서 다른 생성자를 호출할 때는 반드시 해당 생성자의 첫 줄에 작성해야함!!
this() 키워드로 다른 생성자 호출 이전에 코드가 존재하면 오류 발생
제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여
public
, protected
, default
, private
static
, final
, abstract
public
, default
public
, protected
, default
, private
외부에서 객체의 private 필드를 읽어오거나 저장하는 메소드
외부에서 객체의 private 한 필드를 읽을 필요가 있을 때
get
+ 필드이름(첫 글자 대문자)
public String getModel() {
return model;
}
외부에서 객체의 private 한 필드를 저장/수정할 필요가 있을 때
set
+ 필드이름(첫 글자 대문자)
public void setModel(String model) {
this.model = model;
}
public
, default
, final
, abstract
public
, protected
, default
, private
, final
, abstract
, static
public
, protected
, default
, private
, final
, static
final
🚨 제어자 사용시 주의 사항
- 메서드에
static
과abstract
를 함께 사용할 수 없다.- 클래스에
abstract
와final
을 동시에 사용할 수 없다.abstract
메서드의 접근 제어자가private
일 수 없다.- 메서드에
private
와final
을 같이 사용할 필요는 없다.
클래스의 일부분이면서 클래스를 식별해 주는 용도
패키지는 상위 패키지와 하위 패키지를 도트(.)로 구분
package 상위패키지.하위패키지;
예: oop.pk1
,oop.pk2
라는 패키지가 있다고 가정
두 패키지에 모두 Car 클래스가 존재하며 사용하려고 하는 경우
package oop.main;
public class Main {
public static void main(String[] args) {
oop.pk1.Car car = new oop.pk1.Car();
car.horn(); // pk1 빵빵
oop.pk2.Car car2 = new oop.pk2.Car();
car2.horn(); // pk2 빵빵
}
}
다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드
import oop.pk1.Car;
, import oop.pk2.Car;
import oop.pk1.*;
: oop.pk1
패키지 아래에 있는 모든 클래스 사용 가능🔗 스파르타코딩클럽 Java 문법 종합반
🔗 자바의 정석