2020. 3. 11. 12:45ㆍStudy/Computer Science
패키지와 Static
패키지 : java 프로그램은 많은 class로 구성되는데, 이러한 클래스를 폴더 형식으로 관리하는 것
import : 다른 패키지의 클래스 사용하기 위해서는 import 키워드 사용
static : 클래스의 변수나 메서드에 static 사용하면 어디서나 변수 & 메서드 공유가능
클래스변수와 인스턴스 변수
아래 설명은 [https://vaert.tistory.com/101]의 내용을 공부하며 적었다.
일단 static 키워드를 이해하기 위해서는 클래스변수와 인스턴스 변수에 대해 알아야 한다.
쉽게 말하면 static 키워드가 붙은 변수가 클래스변수고 그렇지 않은 것이 인스턴스 변수인데,
아래 예시를 보자
class BookSeries{
String bookName;
int price;
static String author = "황순원";
}
class BookTest{
public static void main(String args[]){
System.out.println("저자명 : " + BookSeries.author); // '저자명 : 황순원' 출력
BookSeries book1 = new BookSeries();
book1.bookName = "학";
book1.price = 6000;
BookSeries book2 = new BookSeries();
book2.bookName = "목넘이 마을의 개";
book2.price = 7000;
System.out.println("book1의 책 제목은 " + book1.bookName + "이며, 가격은 " + book1.price + "원 입니다");
System.out.println("book2의 책 제목은 " + book2.bookName + "이며, 가격은 " + book2.price + "원 입니다");
System.out.println("이제 저자명을 박경리로 변경합니다");
book1.author = "박경리";
System.out.println("book2의 저자는 " + book2.author); // "book2의 저자는 박경리" 출력
}
}
BookSeries의 static변수 (클래스변수)인 author 같은 경우는 BookSeries 클래스로 객체를 생성하지 않아도 사용 가능하다. 하지만 인스턴스변수인 bookName과 price의 경우는 객체를 새로이 만들어야지만이 사용할 수 있다.
따라서, 객체(인스턴스를) 생성하지 않아도 클래스의 요소를 가져다 쓸 수 있는 것이 클래스변수이다.
그리고, 가장 아래쪽을 보면 book1의 저자명만 박경리로 변경했는데, book2의 저자명까지 박경리로 바뀌는 것을 볼 수 있다. 따라서 클래스로 생성한 어떤 객체이더라도 static으로 선언된 속성(변수)의 주소는 동일함을 알 수 있다. 예전에 본 이름은 다른데 같은 주소를 공유하는 변수들로 볼 수 있겠다.
클래스 메소드와 인스턴스 메소드
비슷하게 메소드 역시 static을 사용한 클래스 메소드와 그렇지 않은 인스턴스 메소드로 나뉜다.
따라서, 인스턴스 변수와 클래스 변수의 관계와 유사한데, 정리하면 인스턴스 변수를 이용한 작업을 하는 함수가 인스턴스 메소드, 클래스변수만을 사용하거나 매개변수만 이용하여 작업을 하는 함수가 클래스 메소드이다.
Math 클래스의 모든 함수들은 매개변수만을 받아 작업하므로 클래스 메소드이다.
클래스 멤버와 인스턴스 멤버간의 참조와 호출
같은 클래스에 속한 멤버 (변수 + 메소드)의 경우에는 별도로 객체를 생성하지 않아도 서로 참조와 호출이 가능하다. 하지만, 클래스 멤버가 인스턴스 멤버를 호출 또는 참조하고자 할때는 객체(인스턴스)를 생성해야 한다.
왜냐하면 인스턴스 멤버가 존재하는 시점에는 클래스 멤버가 항상 존재하지만, 반대의 경우는 아닐때도 있기 때문이다.
스턴스 멤버가 이미 초기화된 상태에서 클래스 멤버에서 그 인스턴스 멤버를 호출할 때도 객체를 생성하고 호출해야한다. 아래 예시를 보자
class MemberCall{
int iv = 10;
static int siv = 20;
int iv2 = siv;
// static int siv2 = iv; 하면 오류남 (static 변수의 인스턴스 변수 호출)
static int siv2 = new MemberCall().iv;
}
class MCtest{
public static void main (String args[]) {
MemberCall c1 = new MemberCall();
System.out.println("iv = " + c1.iv); //iv = 10
System.out.println("siv = " + c1.siv); //siv = 20
System.out.println("iv2 = " + c1.iv2); //iv2 = 20
System.out.println("siv2 = " + c1.siv2); //siv2 = 10
}
}
데이터 은닉
private : 멤버 변수가 외부로부터 데이터 변질되는 것을 막을 때는 private 키워드를 사용한다. private 키워드가 붙은 멤버 변수는 오직 해당 클래스 안에서만 서로 접근이 가능하다.
setter 와 getter : private으로 은닉된 변수를 변경할 때는 setter, 읽어올 때는 getter 사용
(setter(), getter() 함수가 있다는게 아니라 이러한 작업을 하는 함수를 setter, getter라고 일컫는 것)
class Book{
private String name;
private int price;
//setter
public void setName(String name) {
this.name = name;
}
public void setPrice(int price) {
this.price = price;
}
//getter
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
class MainClass{
public static void main(String args[]) {
Book book1 = new Book();
book1.setName("학");
book1.setPrice(6000);
String name = book1.getName();
int price = book1.getPrice();
System.out.println("책 제목은 " + name);
System.out.println("책 가격은 " + price);
}
}
상속
상속은 자식 클래스가 부모 클래스의 속성과 기능을 이용할 수 있도록 하는 것이다. 기존의 class를 바탕으로 새로운 class를 쉽게 만들 수 있다는 장점이 있다.
몇가지 특징들을 살펴보면,
1. 부모 클래스는 다수의 자식클래스를 가질 수 있지만, 자식은 하나의 부모 클래스만 가질 수 잇다.
2. 자식 클래스는 부모 클래스의 (private 접근자를 제외한) 모든 변수와 메소드를 사용할 수 있지만 부모 클래스가 자식 클래스의 변수와 메소드를 사용하는 것은 불가능하다.
3. 자식은 또다른 클래스의 부모 클래스가 될 수 있다. 그리고 부모 클래스가 상속받은 멤버도 자식 클래스가 상속받아 사용 가능하다.
4. 자식 클래스는 부모 클래스의 멤버를 override (보수, 수정) 할 수 있다. (@Override 후 수정)
5. private 접근자가 붙은 부모 클래스의 멤버들은 자식 클래스에서 사용할 수 없다.
자식 클래스는 extends 키워드를 이용하여 부모 클래스로부터 상속이 가능하다.
관련 함수와 키워드를 살펴보고 마무리하자
- super() : this()가 자기 자신의 생성자를 호출하는 것과 비슷하게 자신의 부모클래스의 생성자를 높은 조상 순서대로 차례대로 생성자를 모두 호출한다.
- super.멤버명 : 마찬가지로 this. 가 자기 자신의 멤버를 사용할때 객체 생성없이 접근할 수 있는 지정예약어인것 처럼, super는 자신의 부모, 조상들의 멤버필드에 접근하는 지정예약어이다. this와 마찬가지로 생략하여 사용가능하다.
- protected : protected는 반도체와 같은 키워드이다. 외부에서 접근하려고 할때는 private으로 작용하지만 상속관계에서 작용할때는 public으로 작용한다. 따라서, 부모 클래스에서 protected 키워드가 붙은 변수는 외부에서는 사용불가능하지만 상속된 자식 클래스에서는 사용 가능하다.
'Study > Computer Science' 카테고리의 다른 글
Java 프로그래밍 기초 8 (0) | 2020.03.12 |
---|---|
Data Structure - Trees (1) (1) | 2020.03.11 |
Data Sturcture - Queue (1) | 2020.03.10 |
Java 프로그래밍 기초 6 (0) | 2020.03.10 |
Data Structure - stacks (0) | 2020.03.09 |