본문 바로가기
Study/Java Study

자바스터디 4주차 (2)

by hongchii 2021. 6. 1.
728x90
반응형

2021.05.31 - [Study/Java Study] - 자바스터디 4주차 (1)

 

자바스터디 4주차 (1)

2021.05.30 - [Study/Java Study] - 자바스터디 3주차 (3) [빙고 게임 구현 - 2차원 배열 이용] 자바스터디 3주차 (3) [빙고 게임 구현 - 2차원 배열 이용] 2021.05.26 - [Study/Java Study] - 자바스터디 3주차 (..

hong-chii.tistory.com

 

4. 제어자

 

4.1 제어자란?

제어자는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.

접근제어자 그 외
public, protected, default, private static, final, abstract, native, transient, synchronized, volatile, strictfp


제어자는 클래스나 멤버변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다. 단, 접근 제어자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다.


4.2 static - 클래스의, 공통적인

클래스변수(static멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다. 그 이유는 하나의 변수를 모든 인스턴스가 공유하기 때문이다. static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭

제어자 대상 의미
static 멤버변수 - 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.
- 클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.
- 클래스가 메모리에 로드될 때 생성된다.
메서드 - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
- static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.

인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 static메서드로 선언하면 인스턴스를 생성하지 않고도 호출이 가능해서 더 편리하고 속도도 더 빠르다.

class StaticTest { 
	static int width = 200; // 클래스 변수(static 변수) 
    static int height = 120; // 클래스 변수(static 변수) 
    
    static { // 클래스 초기화 블럭 
       // static변수의 복잡한 초기화 수행
       
    } static int max(int a, int b) { // 클래스 메서드(static메서드) 
        return a > b ? a : b; 
   } 
 }

 

4.3 final - 마지막의, 변경될 수 없는

제어자 대상 의미
final 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드 변경될 수 없는 메서드,final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수

 

4.4 abstract - 추상의, 미완성의

제어자 대상 의미
abstract 클래스 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
메서드 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.

 

4.5 접근제어자

접근 제어자는 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다. 접근제어자가 지정되어 있지 않다면 default임을 뜻한다.

제어자 같은 클래스 같은 패키지 자손클래스 전 체
public O O O O
protected O O O  
(default) O O    
private O      

public은 접근 제한이 전혀 없다.
private는 같은 클래스 내에서만 사용하도록하고 protected는 패키지에 관계없이 상속관계에 있는 자손클래스에서 접근할 수 있도록 하는 것이 제한목적이지만, 같은 패키지 내에서도 접근이 가능하다.

대상에 따라 사용할 수 있는 접근 제어자
클래스 public, (default)
메서드 public, protected, (default), private
멤버변수
지역변수 없음

 

접근 제어자를 사용하는 이유
- 외부로 부터 데이터를 보호하기 위해서
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

 

public class Time { public int hour; public int minute; public int second; }

다음과 같이 public 접근제어자를 써서 정의했을 때 클래스의 인스턴스를 생성한 다음, 멤버변수에 직접 접근하여 값을 변경 할 수 있다.

Time t = new Time(); t.hour = 25;

멤버변수 hour는 0보다는 같거나 크고 24보다는 작은 범위의 값을 가져야 하지만 위의 코드에서처럼 잘못된 값을 지정해도 막을 방법이 없다. 그래서 private나 protected로 제한하고, 멤버변수의 값을 읽고 변경할 수 있는 public메서드를 제공함으로써 간접적으로 멤버변수의 값을 다룰 수 있도록 하는 것이 바람직하다.

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; 
    }


get으로 시작하는 메서드는 단순히 멤버변수의 값을 반환하는 일을 하고, set으로 시작하는 메서드는 매개변수에 지정된 값을 검사하여 조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성되어 있다. (getter와 setter)


5. 다형성

 

5.1 다형성이란?

객체지향개념에서 다형성이란 여러가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다.
한마디로 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.

조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.

 

5.2 참조변수의 형변환

참조변수도 형변환이 가능한데, 서로 상속관계에 있는 클래스 사이에서만 가능하다.

자손타입 -> 조상타입 : 형변환 생략가능
자손타입 <- 조상타입 : 형변환 생략불가

 

5.3 instanceof연산자

참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용한다. 주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다. 그리고 연산의 결과로 boolean값인 true와 false 중의 하나를 반환하고, true이면 형변환이 가능하다는 것을 뜻한다.

5.4 참조변수와 인스턴스의 연결

멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의된 경우, 조상타입의 참조변수를 사용했을 때는 조상 클래스에 선언된 멤버변수가 사용되고, 자손타입의 참조변수를 사용했을 때는 자손클래스에 선언된 멤버변수가 사용된다.



6. 추상클래스


6.1 추상클래스란?
추상클래스는 미완성 성계도에 비유할 수 있다. 완성되지 못한 채로 남겨진 설계도를 말한다.
추상클래스로 인스턴스는 생성할 수 없다. 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.

abstract class 클래스이름{ }

6.2 추상메서드
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메서드이다. 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려 주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것이다.

/*주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다.*/ abstract 리턴타입 메서드이름();


6.3 추상클래스의 작성
상속이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면, 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상 클래스를 만드는 것이다.

추상화 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
구체화 상속을 통해 클래스를 구현, 확장하는 작업

 


7. 인터페이스

 

7.1 인터페이스란?

인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스보다 추상화 정도가 높아서 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않는다.

7.2 인터페이스의 작성

interface 인터페이스이름 { 
  public static final 타입 상수이름 = 값; public abstract 메서드이름(매개변수목록); 
}

 

인터페이스 멤버들의 제약사항
- 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
단, static메서드와 디폴트 메서드는 예외

 

7.3 인터페이스의 상속

인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와 달리 다중상속이 가능하다.
※인터페이스는 클래스와 달리 Object클래스와 같은 최고 조상이 없다.

7.4 인터페이스의 구현

class 클래스이름 implements 인터페이스이름 { //인터페이스에 정의된 추상메서드를 구현해야한다. }

 

7.5 인터페이스의 장점

개발시간을 단축시킬 수 있다.
표준화가 가능하다.
서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
독립적인 프로그래밍이 가능하다.

 


8. 내부클래스

 

8.1 내부클래스란?

내부 클래스는 클래스 내에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 두 클래스가 서로 긴밀한 관계에 있기 때문이다.

내부 클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다(캡슐화)

 

 

 

자바의 정석을 토대로 공부 후 정리한 내용입니다.

728x90
반응형

댓글