static
static 예약어는 멤버 메서드나 멤버 변수에 정의 할 수 있으며 지역 변수나 클래스에게는 정의할 수 없다. 멤버 메서드나 멤버 변수에 static이라는 예약어를 정의하면 static 메서드(클래스 메서드)와 static 변수(클래스 변수)라고 불리게 된다. 이유는 멤버 변수나 멤버 메서드들은 해당 객체가 생성될 때 객체가 생성된 메모리 공간에 같이 존재 하게 되지만 static으로 선언된 메서드(멤버 함수)나 변수들은 static영역(메서드 영역) 이라는 곳에 유일하게 만들어 지면서 모든 객체(Object)들이 사용 할 수 있도록 공유 개념을 가지기 때문이다.
static 초기화
클래스가 실행될 때 가장 먼저 호출되는 영역을 만들고자 한다면 호출 블럭에 static를 명시한다. 클래스 실행 시 단 한 번만 실행되어 클래스 실행 시 초기화할 내용을 배치하는데 유용하다.
인스턴스 변수: 객체가 생성될 때 객체에 포함되는 변수
static(클래스) 변수: 객체 생성과 무관, 호출하면 (heap)메모리 영역에 올라감
public class StaticCount {
//인스턴스 변수: 객체가 생성될 때 객체에 포함되는 변수
int c;
//static(클래스) 변수: 객체 생성과 무관, 호출하면 메모리에 올라감
// 호출하면 메모리(static 영역)에 올라감
// 호출할 때는 클래스명을 붙여서 호출해야 함
static int count;
//생성자
public StaticCount() {
c++;
count++;
}
}
public class StaticMain01 {
public static void main(String[] args) {
StaticCount sc1 = new StaticCount();
System.out.println("c: "+sc1.c+", count: "+StaticCount.count);
StaticCount sc2 = new StaticCount();
System.out.println("c: "+sc2.c+", count: "+StaticCount.count);
StaticCount sc3 = new StaticCount();
System.out.println("c: "+sc3.c+", count: "+StaticCount.count);
}
}

상속
클래스의 상속
- 상속(inheritance)은 기존 클래스를 확장해서 새로운 클래스를 만드는 기술을 의미하며 마치 일상 생활에서 부모가 보유하고 있는 재산 중 일부를 자식이 물려 받는 것과 같다고 할 수 있다.
상속 정의
클래스 상속 : extends
인터페이스 상속 : implements
상속의 중요성
- 클래스 상속은 객체의 재사용이라는 장점뿐 만 아니라 코드의 간결성을 제공해주는 객체지향적 언어의 장점과 중요한 특징이 된다. 그러므로 잘 정의된 super클래스가 있다면 sub클래스의 작성이 간편해지고 무엇보다 개발 시간이 단축된다는데 상속의 중요성과 장점을 들 수 있다.
//부모클래스
// Object -> 최상위 클래스
class People extends Object{
public void eat() {
System.out.println("식사하다.");
}
}
//자식클래스
class Student extends People{
public void study() {
System.out.println("공부하다.");
}
public void eat() {
System.out.println("오버라이딩: 식사할거다.");
}
}
public class ExtentionMain02 {
public static void main(String[] args) {
Student student = new Student();
student.eat();
student.study();
System.out.println(student.toString());
}
}
메서드 오버라이딩
오버라이딩은 [메서드 재정의] 라고도 불리며 이는 서로 상속관계로 이루어진 객체들간의 관계에서 비롯된다.
super클래스가 가지는 메서드를 sub클래스에서 똑같은 것을 새롭게 만들게 되면 더 이상 super클래스의 이름이 같은 메서드를 호출할 수 없게 된다. 이를 Overriding이라 하고 또는 멤버 은폐라고도 한다.
@Override : 메서드 재정의가 문법에 맞게 재정의가 되었는지를 검증하는 역할을 수행한다. 만약 문법에 맞게 재정의 되지 않으면 컴파일 오류가 발생한다.
//부모클래스
class GrandParent{
public String getCar() {
return "구형 자동차";
}
}
//자식클래스
class Father extends GrandParent{
//Method Overridng(메서드 재정의)
//상속관계에서 자식클래스에 메서드 재정의를 하면 부모클래스의 메서드가 호출
// 되는 것이 아니라 자식클래스의 메서드가 호출됨
//@Override 어노테이션은 메서드 재정의 문법에 맞게 재정의가 되었는지를
// 검증하는 역할 수행, 문법에 맞게 재정의 되지 않으면 컴파일 오류 발생
@Override
public String getCar() {
return "신형 자동차";
}
}
class Oncle extends GrandParent{
}
public class OverridingMain01 {
public static void main(String[] args) {
Father ft = new Father();
System.out.println("아버지는 " + ft.getCar()+ "를 좋아해요!!");
Oncle on = new Oncle();
System.out.println("삼촌은 " + on.getCar() + "를 좋아해요!!");
}
}
super
super는 앞서 배운 this와 함께 객체를 참조할 수 있는 reference변수이다. this는 특정 객체 내에서 자기 자신의 객체를 참조할 수 있는 유일한 reference변수이다. 그리고 super라는 reference변수는 현재 객체의 바로 상위인 super클래스(부모클래스)를 참조할 수 있는 것이다.
super()
super()는 바로 super클래스의 생성자를 의미하는 것이다. 인자가 있다면 인자의 형태와 일치하는 생성자를 의미한다.
'IT 국비 교육' 카테고리의 다른 글
쌍용교육센터 - 11일 (0) | 2024.03.04 |
---|---|
쌍용교육센터 - 10일 (0) | 2024.02.29 |
쌍용교육센터 - 8일 (1) | 2024.02.27 |
쌍용교육센터 - 7일 (0) | 2024.02.26 |
쌍용교육센터 - 6일 (0) | 2024.02.23 |