JAVA 변수 / 패키지 / 상속
static 변수, instance 변수, local 변수
인스턴스 변수(instance variable)
- 각 인스턴스의 개별적인 저장공간. 인스턴스 마다 다른 값 저장가능
- 인스턴스 생성 후, ‘참조변수.인스턴스 변수명’으로 접근
- 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지 컬렉터에 의해 자동제거됨
클래스(static) 변수(class variable)
- 같은 클래스의 모든 인스턴스들이 공유하는 변수
- 인스턴스 생성없이 ‘클래스이름.클래스(스태틱)변수명’으로 접근
- 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸
public static void main(String[] args){}
private static void aha(){}
static이 있는 이유는 new로 생성없이 접근이 가능해져야하기 때문
지역 변수(local variable)
메소드 내에 선언되며, 메소드의 종료와 함께 소멸
조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸
인스턴스 변수 와 클래스(static) 변수
인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스 마다 각기 다른
값을 유지할 수 있지만, 클래스(static)변수는 모든 인스턴스가 하나의 저장공간을
공유하므로 항상 공통된 값을 갖는다.
클래스 (static) 멤버
- 전역 변수와 전역 함수를 만들 때 사용
- 모든 클래스에서 공유하는 전역 변수나 전역 함수를 만들어 사용할 수 있다
- 클래스 멤버라고도 함
- 객체를 생성하지 않고 접근할 수 있다
- static 메서드 내에서는 this 사용 불가
- static 메서드 내에서는 static 멤버만 접근할 수 있다
- static 멤버의 초기화는 static 블록에서 할 수 있다
- static 블록은 클래스가 메모리에 로딩될 때 실행된다
- static 블록은 생성자보다 앞서 실행된다
static의 활용 - Singleton
- 전체 프로그램 상에서 동일한 인스턴스를 사용해야 할 경우 활용
- 어떠한 상황에서도 단 하나의 인스턴스만 유지한다
- 4대 디자인 패턴에 포함될 정도로 유명하고, 유용한 패턴
예) 스마트폰의 주소록
패키지(package)
패키지란?
- 서로 관련 있는 클래스 또는 인터페이스들의 묶음
패키지 이용의 장점
- 클래스들을 묶음 단위로 제공하여 필요할 때만 사용 가능 (import 문 이용)
- 클래스 이름의 혼란을 막고 충돌을 방지
- 패키지 단위의 접근 권한 지정 가능
사용법
1) import 패키지명.클래스명(인터페이스명);
//지정된 클래스(인터페이스)만 불러옴
import java.applet.Applet; //
java.applet 패키지 내의 Applet을 불러옴
2) import 패키지명.*; // 패키지 내의 모든 클래스(인터페이스)를 불러옴
예) import java.io.*;
// java.io 패키지 내 모든 클래스(인터페이스)를 불러옴
새로운 패키지의 작성
패키지의 이름과 계층 구조를 결정
패키지를 위치시킬 디렉토리에 패키지의 계층 구조와 동일한 디렉토리 구조 생성
패키지에 추가할 클래스들을 생성하고 해당 디렉토리로 이동
새로 생성된 패키지가 위치한 디렉토리를 환경변수에 추가
Inheritance and Polymorphism (상속과 다형성)
상속 Inheritance
부모 클래스에 정의된 필드와 메서드를 자식 클래스가 물려받는 것
상속의 필요성
클래스 사이의 멤버 중복 선언 불필요
필드, 메서드 재사용으로 클래스가 간결
클래스간 계층적 분리 및 관리
자바 언어 상속의 특징
다중 상속을 지원하지 않음
상속의 회수에 제한을 두지 않음
최상위 클래스는 java.lang.Object
상속 선언의 예
상속과 생성자
자식 생성자에서 특별한 지시가 없으면 부모 클래스의 기본 생성자가 선택된다
부모 클래스의 특정 생성자를 호출해야 할 경우 super() 로 명시적으로 호출
부모의 필드나 메서드에 접근시에는 super 키워드를 사용
상속과 접근제한자
메서드 오버라이딩 (Method Overriding)
부모 클래스와 자식 클래스의 메서드 사이에서 발생하는 관계
부모 클래스의 메서드를 동일한 이름으로 재 작성
같은 이름, 같은 리턴타입, 같은 시그너쳐
부모 클래스 메서드 무시하기
@Overriding <- Annotation 정말 오버라이딩인지 확인
Upcasting and Downcasting
업캐스팅 (Up Casting or Promotion)
자식 클래스가 부모 클래스 타입으로 변환되는 것
명시적으로 타입 변환을 하지 않아도 된다
다운캐스팅 (Down Casting)
업캐스팅된 것을 원래대로 되돌리는 것
명시적으로 타입 변환을 해야 한다
다운캐스팅시 어떤 클래스를 객체화한 것인지 알고자 한다면 instanceof 를 사용한다
다형성(Polymorphism)
같은 타입이지만, 실행 결과가 다른 객체를 이용할 수 있는 성질
자바는 부모 클래스로의 타입 변환을 허용한다
추상 클래스와 인터페이스 Abstract Class and Interface
추상화
객체의 속성과 기능 중 중요한 것들은 남기고 필요 없는 것은 없애는 것
또는 객채들간의 공통되는 특성을 추출하는 것
추상 클래스
실체 클래스의 공통적인 특성들을 추출해서 선언한 클래스
실체 클래스를 만들기 위한 부모 클래스로만 사용
스스로 객체가 될 수는 없다
확장을 위한 용도로만 사용
하나 이상의 추상 메서드를 가짐
속성(필드)와 기능(메서드)을 정의할 수 있다
추상 메서드
구현이 불가능한 메서드로서 선언만 한다
추상 클래스를 상속하는 실체 자식 클래스는 추상 메서드를 반드시 구현해야 한다
추상 메서드는 추상 클래스에만 존재한다
추상 클래스의 선언
클래스 선언에 abstract 키워드
추상 클래스의 상속
extends 키워드 사용
추상 클래스를 상속하는 클래스는 반드시 추상 클래스 내의 추상 메서드를 구현해야 함
특정 기능의 구현을 강요하는 측면도 있음 (예: 자동차의 브레이크 기능은 꼭 구현되어야 함)
활용
여러 클래스들이 상당수 공통점을 가지고 있으나 부분적으로 그 처리 방식이 다른 경우부모 클래스를 추상 클래스로 정의하여 자식 클래스들이 각각 해당 메서드를 구현
인터페이스
개념
서로 관계가 없는 물체들이 상호작용을 하기 위해 사용하는 장치나 시스템
클래스 구조상 관계와 상관 없이 클래스들에 의해 구현될 수 있는 규약
사용 목적
클래스들 사이의 유사한 특성을 부자연스러운 상속 관계를 설정하지 않고 얻어냄
개발 코드를 수정하지 않고, 가용하는 객체를 변경할 수 있도록 하기 위함
활용
하나 혹은 그 이상의 클래스들에서 똑같이 구현되어질 법한 메서드를 선언하는 경우
클래스 자체를 드러내지 않고 객체의 프로그래밍 인터페이스를 제공하는 경우
인터페이스 선언
인터페이스 구현
다중 상속을 지원하지 않는 자바에서 다중 상속의 장점을 활용할 수 있음
인터페이스는 다중 implements를 할 수 있다