class멤버와 instance멤버
static - class
non static - instance
(이 관계를 그림으로 이해하는 편이 좋다)
f1의 첫번째 줄은 실제로 값이 존재하지 않고 클래스 첫번째 줄을 가르킨다. 하지만 f1의 첫째줄에 값이 변경되면 가르키는 클래스의 값이 변경되고 그 해당하는 인스턴스의 값이 바뀌는 형태이다. f2의 두번째 줄은 해당 클래스의 값이 있다면 복제가 되지만 서로 링크되어있지 않은 독립적인 존재여서 f1의 값을 변경해도 클래스는 바뀌지 않는다. 메소드 또한 마찬가지이다.
해석하자면 클래스의 변수를 바꾸면 모든 인스턴스의 변수의 값이 바뀐다. 반대로 인스턴스에서 클래스의 값을 바꾸면 클래스의 값이 바뀌고 그에 해당하는 모든 인스턴스의 값이 바뀐다.
static을 맴버(변수,메소드) 앞에 붙이면 클래스의 맴버가 된다.
인스턴스 메소드는 클래스 멤버에 접근 할 수 있다.
클래스 메소드는 인스턴스 멤버에 접근 할 수 없다.
인스턴스 변수는 인스턴스가 만들어지면서 생성되는데, 클래스 메소드는 인스턴스가 생성되기 전에 만들어지기 때문에 클래스 메소드가 인스턴스 맴버에 접근하는 것은 존재하지 않는 인스턴스 변수에 접근하는 것과 같다
- 인스턴스 변수 -> Non-Sta tic Field
- 클래스 변수 -> Static Field
필드(field)라는 것은 클래스 전역에서 접근 할 수 있는 변수를 의미한다
지역변수와 전역변수
지역적인 것이 전역적인 것보다 우선순위가 높다는 원칙은 특수한 것이 전체적인 것보다 우선순위가 높다는 의미로도 해석할 수 있는데 이러한 원리는 공학 전반에서 적용되는 원칙이기 때문에 교양으로서도 유익하다. 전역적으로 기본값을 설정하고, 필요에 따라서 지역 값을 다르게 사용하는 것이 더 효율적이기 때문에 이러한 원칙이 사용된다. 클래스 전역에서 접근 할 수 있는 변수를 전역변수(클래스 변수와 인스턴스 변수), 메소드 내에서만 접근 할 수 있는 변수를 지역변수(local variable)라고 한다.
지역 변수 - 사용 전 사용자가 직접 초기화 해야함. 반대로 나머지 변수들은 자동으로 초기화
인스턴스 변수 (instance variable 줄여서 iv) - 전역에서의 개별 속성 (iv 앞에 static이 붙으면 static + iv = cv)
클래스 변수 (class variable 줄여서 cv) - 전역에서의 공통적인 속성
원카드로 예를들면 무늬나 숫자는 인스턴스 변수에 해당하고 클래스 변수는 카드의 폭이나 넓이 같은 카드가 가져야 할 공통적인 성질을 말한다. 이 말은 static은 공통적인 것을 정의할때 사용한다는 말이다.
메소드 안에서 선언된 변수 v가 지역 변수가 되면서 인스턴스 전역에서 유효한 인스턴스 변수 v의 값보다 우선순위가 높아지면서 20이 출력된 것이다. (이 때 전역변수에 접근하려면 8행 변수에 this를 추가하면 된다. this는 인스턴스 자신을 의미하는 키워드이다)
인스턴스 메소드
- 인스턴스 생성 후 '참조변수(인스턴스화 시킨 변수이름).메소드이름()' 으로 호출
- 인스턴스 멤버와 관련된 작업을 하고 메소드 내에서 인스턴스 변수 사용가능
클래스 메소드 (static method)
- 객체 생성없이 '클래스이름.메소드이 름()'으로 호출
- 인스턴스 멤버와 관련없는 작업을 하고 메소드 내에서 인스턴스 변수 사용불가
전역적인 사용의 효용이 분명한 데이터에 한해서 제한적으로 전역변수를 사용하도록 하고 있는 것이다. 객체지향 프로그래밍은 바로 이런 문제를 극복하기 위한 노력이라도고 볼 수 있다. 즉 연관된 변수와 메소드를 그룹핑 할 수 있도록 함으로서 좀 더 마음놓고 객체 안에서 전역변수를 사용할 수 있도록 한 것이다.
생성자의 특징
생성자 (클래스 이름 == 동일 클래스 내의 메소드 이름)
자바에서는 같은이름의 메소드를 정의하지 않을 시 자동으로 같은이름의 기본 생성자(메소드)를 만들어준다. 단 기본 생성자는 내용도 없고 매개변수가 없는 기본 메소드이다.
어떤 객체가 반드시 해야 될 일이 있을 때 그것을 별도의 생성자 메소드로 만들어서 그 절차를 포함시켜서 이 객체를 사용하는 사람이 사용하기 위해 숙지해야 할 사안을 더 줄일 수 있도록 또는 반드시 해야하는 일을 놓치지 않도록 생성자 메소드를 쓴다. (예로 인스턴스가 생성될 때 입력값을 강제하도록 하는 기능)
- 값을 반환 하지 않는다
생성자는 인스턴스를 생성해주는 역할을 하는 특수한 메소드라고 할 수 있다. 그런데 반환 값이 있다면 엉뚱한 객체가 생성될 것이다. 따라서 반환 값을 필요로하는 작업에서는 생성자를 사용하지 않는다. 반환 값이 없기 때문에 return도 사용하지 않고, 반환 값을 메소드 정의에 포함시키지도 않는다.
- 생성자의 이름은 클래스의 이름과 동일하다.
자바에서 클래스의 이름과 동일한 메소드는 생성자로 사용하기로 약속되어 있다
this() - 생성자
- 생성자에서 다른 생성자 호출할때 사용
- 다른생성자 호출 시 첫 줄에서만 사용가능
this - 참조변수
- 인스턴스 자신을 가르키는 참조변수
- 인스턴스 메소드(생성자포함)에서 사용가능
- 지역변수와 인스턴스변수를 구별할 때 사용
상속
상속은 객체지향의 재활용성을 극대화시킨 프로그래밍 기법이며 동시에 객체지향을 복잡하게 하는 주요 원인이라고도 할 수 있다. 어떤 객체가 있을 때 그 객체의 필드(변수)와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속이라고 한다.
객체를 자신이 만들지 않았거나, 소스를 변경 할 수 없고, 임의로 추가하면 불필요한 기능이 포함될 수 있으며 이러한 기능으로 인해 상속을 활용한다.
부모 클래스와 자식 클래스의 관계를 상위(super) 클래스와 하위(sub) 클래스라고 표현하기도 한다. 또한 기초 클래스(base class), 유도 클래스(derived class)라고도 부른다.
상속 정의 - class (상속받을 메소드이름) extends (상속할 상위 클래스)
상속을 통해서 코드의 중복을 제거할 수 있었고, 또 부모 클래스을 개선하면 이를 상속받고 있는 모든 자식 클래스들에게 그 혜택이 자동으로 돌아간다. 다시 말해서 유지보수가 편리해진다는 것이다. 재활용성과 중복의 제거, 그리고 유지보수의 편의는 있지만 반대로 코드의 복잡도는 증가한다.
super - 상위 클래스를 가르키는 키워드이다. 상속관계에서 내용이 중복될 때 super 키워드를 이용하여 상위클래스의 내용을 불러올 수 있다. 또한 여기에 ()붙이면 부모 클래스의 생성자를 의미하게 된다. 이렇게 하면 부모 클래스의 기본 생성자가 없어져도 오류가 발생하지 않는다.
※ 부모가 없는 클래스는 자동적으로 object 클래스(toString(),equals() 등)를 상속받게 된다.
Overriding
상속은 상위클래스에서 하위클래스에게 물려주는 기능이다. 반대로 주어진 것만 사용하지 않고 이런 제약을 벗어나 동작방법을 변경하여 재정의하는 것을 메소드 오버라이딩(overridng)이라고한다.
예를들어 같은 상속된 클래스에서 동일한 메소드를 실행시키면 상위클래스 메소드보다 하위클래스의 메소드 실행이 더 우선적이라는 것이다.
위의 예제로 sum 메소드만 확인하면 출력되는 값은 서브에 있는 sum 메소드가 출력된다.
메소드의 형태를 정의하는 사항들을 통틀어 메소드의 서명 (signature) 이라고한다.
오버라이딩이 성립하기 위한 조건
- 부모클래스의 메소드의 이름, 매개변수(매개변수 안의 숫자 데이터 타입, 순서), 리턴값이 같아야 한다.
- 접근제어자를 부모클래스의 메소드보다 좁은 범위로 변경할 수 없다.
- 예외는 부모클래스의 메소드보다 많이 선언할 수 없다.
Overloading
위와 같이 자바에서는 메소드의 이름이 같다고 하더라도 매개변수의 숫자와 데이터타입이 다르면 그것은 다른 메소드로 인식한다. 환경과 조건에 따라 동일 한 이름의 메소드를 여러개 정의하는것 이것을 오버로딩(overloading)이라고 한다.
(다시 말해 이름은 같지만 시그니처는 다른 메소드를 중복으로 선언 할 수 있는 방법이다)
오버로딩이 성립하기 위한 조건
- 메소드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 반환 타입은 영향없다.
위 예제처럼 상속 관계에서도 오버로딩은 사용가능하다.
riding(올라탄다)을 이용해서 부모 클래스의 메소드의 동작방법을 변경하고, loading을 이용해서 같은 이름, 다른 매개변수의 메소드들을 여러개 만들 수 있다는 사실을 아는 것이 중요하다.
'Java' 카테고리의 다른 글
Java 기초 입문 6일차 (Interface, 다형성, Exception, multi catch) (0) | 2022.11.23 |
---|---|
Java 기초 입문 5일차 (classpath, API, 접근제어자, abstract) (0) | 2022.11.22 |
Java 기초 입문 3일차 (객체 지향 프로그래밍, 클래스와 인스턴스) (0) | 2022.11.18 |
Java 기초 입문 2일차 (method, input output, GUI) (0) | 2022.11.18 |
Java 기초 입문 1일차 (조건문, 반복문, 배열) (0) | 2022.11.16 |