① 참조변수 super ≒ this(는 지역변수와 인스턴스 변수 구별에 사용.)
: 조상의 멤버를 자신의 멤버와 구별할 때 사용하고 객체 자신을 가리키는 참조변수이다.
인스턴스 메서드(생성자) 내에서만 존재하며 static 메서드에서는 사용 불가.
class Parent {
int a = 1;
}
class Child extends Parent {
int a = 2;
public String toString() {
return "this: "+this.a+", super: "+super.a;
}
void display() {
System.out.println(a);
System.out.println(this.a);
System.out.println(super.a);
}
}
public class personal_oop_InheritanceSuper_test {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
System.out.println(ch); //toString()자동 호출
}
}
→ display()메서드를 호출하면
a(지역변수)는 가장 가까이 있는 수인 a=2를 출력하고
this.a는 클래스 내의 자기 자신을 가리키기 때문에 a=2를 출력하고
super.a는 조상의 멤버를 가리키기 때문에 1을 출력한다.
② super() ≒ this()
: 조상의 생성자를 호출할 때 사용, 조상의 멤버는 조상의 생성자를 호출해서 따로 초기화한다.
- 생성자의 첫 줄에 반드시 생성자를 호출해야 함.
public class Ex7_4{
public static void main(String args[]){
Point3D p=new Point(1, 2, 3);
System.out.println("x= "+p.x+", y= "+p.y+", z="+p.z);
}
}
class Point{
int x, y;
Point(int x, int y){
this.x=x;
this.y=y;
}
}
class Point3D extends Point{
int z;
Point3D(int x, int y, int z){
super(x, y); //Point(int x, int y)를 호출
this.z=z;
}
}
③ 제어자
: 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
- 접근제어자 : public, protected, (default), private
그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp
- static : 클래스의, 공통적인
class StaticTest{
static int width=200; //클래스 변수(static 변수)
static int height=120; //클래스 변수
static { } //클래스 초기화 블럭
static int max(int a, int b){ //클래스 메서드(static 메서드)
return a>b? a:b; //인스턴스 변수, 인스턴스 메서드 사용불가.
}
}
→ static 멤버변수 :
> 공통적으로 사용되는 클래스 변수가 된다.
> 인스턴스를 생성하지 않고도 사용 가능하다. (클래스이름.변수명)
→ static 메서드 :
> 인스턴스를 생성하지 않고도 호출이 가능하다. (클래스이름.메서드이름)
> static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.
- final : 마지막의, 변경될 수 없는
final class FinalTest{ //조상이 될 수 없는 클래스
final int MAX_SIZE=10; //값을 변경할 수 없는 멤버변수(상수)
final void getMaxSize(){ //오버라이딩할 수 없는 메서드(변경불가)
final int LV=MAX_SIZE; //값을 변경할 수 없는 지역변수(상수)
return MAX_SIZE;
}
}
→ final 클래스 :
> 조상이 될 수 없다.
→ final 메서드 :
> 오버라이딩을 통해서도 재정의 될 수 없다.
→ final 멤버변수 or 지역변수 :
> 값을 변경할 수 없는 상수가 된다.
- abstract : 추상의, 미완성의
abstract class AbstractTest{ //추상 클래스 (추상 메서드를 포함한 클래스)
abstract void move(); //추상 메서드 (구현부가 없는 메서드)
}
→ abstract 클래스 :
> 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
→ abstract 메서드 :
> 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 의미한다.
→ 추상 클래스는 인스턴스를 생성할 수 없다.
④ 접근 제어자 (public, protected, (default), private)
: 멤버 또는 클래스에 사용되어 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
→ 접근 범위가 넓은 순 public > protected > (default) > private
⑤ 캡슐화와 접근 제어자
: 접근 제어자를 사용하는 이유는 클래스 내부에 선언된 데이터를 보호하고, 외부에는 불필요한 내부적으로만 사용되는 부분을 감추기 위해서이다.
이것을 '데이터 감추기'라고 하며 객체지향개념의 '캡슐화'에 해당한다.
<get 메서드>
접근제어자 반환타입 get메서드이름() {
return 변수명;
}
<set 메서드>
접근제어자 void set메서드이름() {
//값을 변경(설정)할 내용
}
→ getter, setter 메서드
get으로 시작하는 메서드는 멤버변수의 값을 반환(return)하는 일을 하고,
set으로 시작하는 메서드는 값을 설정하고 조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성되어 있다.
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 || hour>23) return;
this.hour=hour;
}
public int getMinute(){return minute;}
public void setMinute(int minute){
if(minute<0 || minute>59) return;
this.minute=minute;
}
public int getSecond(){return second;}
public void setSecond(int second){
if(second<0 || second>59) return;
this.second=second;
}
→ 만일 상속으로 확장될 클래스라면 접근 제어자를 private 대신 protected를 사용해야 한다.
'프로그래밍 > Java' 카테고리의 다른 글
Java_객체지향언어(7)_instanceof연산자, 매개변수의 다형성, 객체배열 (0) | 2022.11.17 |
---|---|
Java_객체지향언어(6)_다형성, 참조변수의 형변환 (0) | 2022.11.15 |
Java_객체지향언어(4)_상속, 포함관계, 오버라이딩 (0) | 2022.11.07 |
Java_객체지향언어(3)_static메서드와 인스턴스메서드, 오버로딩, 생성자, 참조변수 this, 생성자 this() (0) | 2022.10.26 |
Java_객체지향언어(2)_인스턴스변수, 클래스변수, 지역변수, 메서드 사용법, 기본형 매개변수와 참조형 매개변수의 차이 (0) | 2022.10.23 |