접근제어자
public : 접근제한이 없음 - 다른 패키지에서도 접근 가능
protected : 같은 패키지 + 상속받은 클래스에서 접근 가능
(protected는 상속받은 개체를 자식클래스가 만들어서 자식클래스의 객체로 지정해서 사용)
default : 같은 패키지에서만 접근 가능
private : 클래스 내에서만 접근 가능
(다른 패키지에서 상속받았을 경우 default나 private은 접근할 수 없다.)
접근제어자를 사용하는 이유
Source - generate toString() 클릭 : override된 메서드
Source - generate getters and setters() : 변수의 값을 얻거나 세팅할 수 있는 메서드
상속받은 메서드를 다른 내용의 메서드로 변경하기 위해.
Object라는 클래스에 toString()이라는 메서드를 상속받은 것 : 주소를 출력시켜주는 메서드
메서드를 사용하는 것의 장점 : 메서드 안에 로직을 작성할 수 있음
시간을 나타내는 클래스
public class Time {
private int hour;
private int minute;
private int second;
public int getHour() {
return hour;
}
public void setHour(int hour) {
if(hour < 0){
this.hour = 0;
}else if(hour > 23){
this.hour = hour % 24;
}else{
this.hour = hour;
}
}
public int getMinute() {
return minute;
}
public void setMinute(int minute) {
if(minute < 0){
this.minute = 0;
}else if(minute > 59){
this.minute = minute % 60;
setHour(this.hour + (minute / 60));
}else{
this.minute = minute;
}
}
public int getSecond() {
return second;
}
public void setSecond(int second) {
if(second < 0){
this.second = 0;
}else if(59 < second){
this.second = second % 60;
setMinute(this.minute + (second / 60));
}else{
this.second = second;
}
}
void clock(){
while (true){
System.out.println(toString());
stop();
setSecond(second + 1);
}
}
private void stop(){
//clock을 구현하기 위해 부수적으로 만든 메서드 - 숨기는 게 나음
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} //프로그램을 잠시동안 멈추게 하는 메서드(밀리세컨단위, 1000을 입력하면 1초)
}
@Override
public String toString() {
return hour + ":" + minute + ":" + second;
}
}
추상메서드 : 선언부만 있고 구현부가 없는 메서드(내용이 없는 메서드)
추상클래스 : 추상메서드를 하나라도 가지고 있는 클래스
추상클래스는 객체생성해서 사용할 수 없음(내용이 없는 메서드),
부모클래스로만 사용함.(상속시키기 위해 만든 클래스)
자식클래스들 간에 메서드는 똑같은데 내용이 다를 때 사용
추상메서드를 상속받으면 메서드를 완성해줘야함. -> 아니면 컴파일 에러
(자식클래스에서는 반드시 메서드를 오버라이딩 해서 만들어줘야 함)
추상클래스를 사용하는 경우의 예)
Animal 클래스에 동물들이 소리를 내는 메서드를 만들고 싶을 때.
소리를 내는 메서드를 선언부만 만들고 동물이름을 지정한 클래스들에 상속한다.
public abstract class Animal {
//소리를 내는 메서드
abstract void sound();
}
class Dog extends Animal{
@Override
void sound() {
System.out.println("멍멍!!");
}
}
class Cat extends Animal{
@Override
void sound() {
System.out.println("야옹");
}
}
class Mouse extends Animal{
@Override
void sound() {
System.out.println("찍찍");
}
}
자식클래스들에게 강제성을 부여
인터페이스
인터페이스 : 클래스처럼 하나의 데이터 구조, 클래스는 구체적인 세부내용있지만 인터페이스는 틀만 존재
상수, 추상메서드만 사용(일반적인 변수와 메서드를 넣을 수 없음)
상수 : 값을 변경할 수 없는 변수(고정된 값을 저장하기 위해 만든다.) 전부 대문자 사용.
인터페이스의 모든 멤버변수는 public static final 제어자를 사용해야한다.
public static final int NUM1 = 1; //상수
final : 상수를 만드는 제어자, 변수 앞에 위치해서 변수의 값을 변경하지 못하게 만든다.
모든 멤버변수의 제어자가 같기 때문에 생략이 가능하다.
int NUM2 = 2;
인터페이스의 모든 메서드는 public abstract 제어자를 사용해야 한다.
public abstract void method1();
모든 메서드의 제어자가 같기 때문에 생략이 가능하다.
void method2();
추상클래스가 있기 때문에 부모로서의 역할만 한다.
클래스는 여러 개의 인터페이스를 상속받을 수 있다.
인터페이스를 상속받을 때는 implements를 사용
추상클래스와 인터페이스의 차이 : 추상클래스는 일반적인 변수와 메서드를 가질 수 있다.
ಠ_ಠ