기록 > 기억
[JAVA] 객체와 클래스 본문
객체와 클래스
● 객체
필드(속성)와 메소드(동작)로 구성됨
객체들은 서로 메소드를 호출하고 결과를 반환받음
● 객체지향 프로그래밍(OOP) 특징
① 캡슐화
객체의 필드와 메소드를 외부에서 접근할수 없도록 숨김 (접근 제한자)
외부 객체는 객체 내부의 구조를 알지 못함 (객체가 노출한 필드와 메소드만 이용가능)
캡슐화를 하는 이유는 외부에서 함부로 데이터를 조작하지 않게 하기 위함
② 상속
부모 객체의 필드와 메소드는 자식 객체에서 사용가능
→ 반복되는 코드의 중복을 줄여줌
→ 유지보수 편리 (자식 객체가 여러개 일때 부모 객체의 메소드만 수정하면 됨)
→ 객체의 다형성을 구현가능
③ 다형성
부모 객체에는 모든 자식 객체를 대입 가능
인터페이스에는 모든 구현 객체를 대입 가능
● 객체 생성
① 클래스 생성
public class Car {
//필드 → 데이터가 저장되는 곳
//생성자 → 객체 생성시 호출되며 값을 초기화 시킴
//메소드 → 객체의 동작(기능)
}
② 클래스로부터 객체 생성 (인스턴스화)
//new 연산자로 생성자 호출해서 객체생성
Car c1 = new Car(); //100 번지
Car c2 = new Car(); //200 번지
//메모리의 힙 영역에 객체 생성됨
//클래스 변수 c1, c2 에는 각 객체가 생성된 주소값을 저장
● 필드
public class Car {
//필드 → 초기값을 주지 않아도 자동 초기화함
int speed;
int maxSpeed = 140;
}
//기본값 (정수 : 0, 실수 : 0.0, boolean : false, 참조필드: null)
//Car 객체 생성
Car c = new Car();
//c 가 Car 객체의 주소값을 참조하므로 c 를 통해 Car 객체의 필드 접근가능
c.speed = 100;
● 생성자
ⓛ 기본 생성자
public Class Car {
//필드
String model;
String color;
int maxSpeed;
//생성자를 선언하지 않으면 컴파일러가 기본 생성자를 추가시킴
public Car() {}
}
Car c = new Car();
//생성자를 선언하지 않아도 위와 같이 사용할 수 있었던 이유 → 컴파일러가 기본 생성자를 추가해줬기 때문
② 생성자 추가
//개발자가 추가한 생성자가 있으면, 컴파일러는 기본 생성자를 추가하지 않음!!
public Car(int maxSpeed) {
this.maxSpeed = maxSpeed; //필드 초기화
}
Car c1 = new Car(); //컴파일 에러발생
Car c2 = new Car(200); //개발자가 추가한 생성자 호출
③ 생성자 오버로딩 → 같은 이름의 생성자를 여러개 선언 (매개변수 타입, 개수, 순서 다름)
public Car() { ... }
public Car(String model) { ... }
public Car(String model, String color) { ... }
public Car(String model, String color, int maxSpeed) { ... }
//외부에서 값을 받아 객체를 초기화
Car c1 = new Car();
Car c2 = new Car("아반떼");
Car c3 = new Car("스팅어", "레드");
Car c4 = new Car("캐스퍼", "카키", 150);
● 메소드
① 리턴 타입 → 있을수도 있고 없을수도 있음
public class Car {
int gas = 60;
//리턴타입이 있으면 리턴값을 지정해야 함
public int getGas() {
return gas;
}
//접근제한자 리턴타입 메소드명([매개변수, ...]) { ... }
public void drive() {
System.out.println("운전 시작");
while(true) {
System.out.println("기름 : " + gas);
if(gas > 0) {
gas -= 10;
}else {
System.out.println("운전 종료(기름 부족)");
return; //메소드 실행문 종료 (break;와 같은 효과)
}
}
}
}
Car c = new Car();
int gas = c.getGas(); //리턴타입이 int 타입이라 타입 맞춰줘야 함
if(gas > 0) {
c.drive(); //리턴타입 없으니까 메소드만 호출
}
② 메소드 오버로딩 → 같은 이름의 메소드를 여러개 선언 (메소드 중복선언)
//매개변수 타입, 개수, 순서가 달라야 함
public int plus(int x, int y) {
int res = x + y;
return res;
}
public double plus(double x, double y) {
double res = x + y;
return res;
}
Calc calc = new Calc();
int res1 = calc.plus(10, 20);
double res2 = calc.plus(10.5, 20.5);
System.out.println(res1); //30
System.out.println(res2); //31.0
● 인스턴스 멤버 → 각 객체마다 가지고 있는 필드와 메소드 (객체 생성해야 필드와 메소드 접근가능)
public class Car {
//필드
int speed;
//메소드
int getSpeed() {
return speed;
}
}
Car c = new Car(); //객체생성
c.speed = 80; //참조변수 c 를 통해서 인스턴스 필드 접근가능
int s = c.getSpeed(); //참조변수 c 를 통해서 인스턴스 메소드 접근가능
System.out.println("속도 : " + s);
● 정적(static) 멤버 → 객체를 생성하지 않고 클래스로 접근해서 사용 (메소드 영역에 존재)
public class Calc {
//정적(static) 필드
static double pi = 3.141592;
//정적(static) 메소드
static int plus(int x, int y) {
int res = x + y;
return res;
}
}
System.out.println(Calc.pi); //클래스명.정적필드
int res = Calc.plus(10, 20); //클래스명.정적메소드
System.out.println(res);
● 싱글톤 → 하나의 어플리케이션에서 단 하나의 객체만 생성
public class Singleton {
//정적 필드 → 자기 클래스타입으로 정적필드 선언, 객체생성, private으로 외부접근 방지
private static Singleton singleton = new Singleton();
//생성자 → 접근제한자 private을 붙여 외부에서 new 연산자로 생성자 호출 못하게 함
private Singleton() {};
//정적 메소드
public static Singleton getInstance() {
return singleton;
}
}
● 접근 제한자 → 클래스, 필드, 생성자, 메소드에 대한 접근 제한
접근 제한자 | 설 명 |
public | 외부에서 접근 가능 |
protected | 상속관계 |
default | 다른 패키지에서 접근 불가 |
private | 외부에서 절대 접근 불가 (클래스 내부에서만 사용가능) |
● Getter / Setter
public class Car {
//클래스를 선언할때 필드는 일반적으로 private 접근제한 → 외부에서 데이터 조작 방지
private int speed;
//getter → private 필드의 값을 리턴
public int getSpeed() {
return speed;
}
//setter → 외부에서 준 값을 유효성 검사 후 필드값 변경
public void setSpeed(int speed) {
//유효성 검사
this.speed = speed;
}
}
'IT국비지원' 카테고리의 다른 글
[JAVA] 예외 처리 (0) | 2021.10.25 |
---|---|
[JAVA] 인터페이스 (0) | 2021.10.25 |
[JAVA] 상속 (0) | 2021.10.24 |
[JAVA] 참조 타입 (0) | 2021.10.24 |
[JAVA] 조건문과 반복문 (0) | 2021.10.24 |
[JAVA] 연산자 (0) | 2021.10.24 |
[JAVA] 변수와 형변환 (0) | 2021.10.24 |
Comments