본문 바로가기
Language/Java

[명품 Java Programming]4장 클래스와 객체

by DEV Lee 2020. 7. 11.


명품 자바 프로그래밍 4장


4.1 객체 지향과 자바

*객체(object)란?

자신만의 고유한 특성(state)과 행동(behavior)을 가지는 모든 것.

 

객체지향의 특성

  • 캡슐화(Encapsulation)

객체의 내부를 보호. class 라는 캡슐을 사용하며 필드(멤버 변수)메소드(멤버 함수)로 구성

 

  • 상속(Inheritance)

자바의 상속은 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장(expends)하는 개념.

- 부모 클래스: 슈퍼 클래스(super class)

- 자식 클래스: 서브 클래스(sub class)

 

  • 다형성(Polymorphism)

같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현하는 것.

- 메소드 오버라이딩(overriding): super class에서 구현된 메소드를 sub class에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 것.

- 메소드 오버로딩(overloding): 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러 개 만드는 것.

 

 

객체 지향 언어의 목적

절차지향(Structured Procedural Programming language)의 단점을 보완한 객체지향(Object Oriented Language)

  • 소프트웨어의 생산성 향상
  • 실세계에 대한 쉬운 모델링

 

4.2 자바 클래스 만들기

클래스(class)

  • 객체(instance)를 만들어내기 위한 설계도 혹은 틀
  • 붕어빵 틀은 class, 붕어빵은 instance
public class Circle{//접근권한 클래스선언 클래스이름
	//필드
    public int radius;//원의 반지름 필드
    public String name;//원의 이름 필드
    
    //메소드
    public Circle(){//원의 생성자 메소드
    }
    public double getArea(){//원의 면적 계산 메소드
    	return 3.14*radius*radius;
    }
}

- 이 코드는 이름이 Circle인 클래스를 선언.

- 객체 내에 값을 저장할 멤버 변수를 필드라고 부름. 여기서는 radius와 name 두 필드.

- public은 접근지정자.

- 클래스의 이름과 동일한 메소드를 생성자(constructor). 객체가 생성될 때 자동으로 호출되는 특별한 메소드

 

Circle 클래스와 객체 생성하고 활용

public static void main(String[]args){
	Circle pizza;//Circle 객체에 대한 레퍼런스 변수 pizza 선언
    pizza=new Circle;//Circle 객체 생성
    
    pizza.radius=10;//radius 필드에 10 저장
    pizza.name="자바피자";//name 필드에 "자바피자" 저장
    double area=pizza.getArea();//pizza 객체의 면적 알아내기
}
  • 레퍼런스 변수 선언

변수 pizza는 Circle  클래스의 객체에 대한 주소(정확히 말해 레퍼런스)를 가지는 변수(*객체는 아님*).

 

  • 객체 생성, new 연산자

Circle 객체의 주소(레퍼런스)르류pizza 변수에 대입. 

- Circle 타입 크기의 메모리 할당

- Circle() 생성자(constructor)코드 실행

 

  • 객체 멤버 접근

객체 멤버에 접근할 때는 레퍼런스 변수 뒤에 점(.) 연산자를 붙임.

 

4.3 생성자(constructor)

객체가 생성될 때 객체의 초기화를 위해 샐힝되는 메소드

public class Circle{//접근권한 클래스선언 클래스이름
	//필드
    public int radius;//원의 반지름 필드
    public String name;//원의 이름 필드
    
    //메소드
    public Circle(){//매개 변수 없는 생성자
    	radius=1; name="";//필드 초기화
    }
    public Circle(int r, String n){
    	radius=r; name=n;//argument로 필드 초기화
    }
    public double getArea(){//원의 면적 계산 메소드
    	return 3.14*radius*radius;
    }
}
  • 생성자의 이름은 클래스 이름과 동일
  • 생성자는 여러 개 작성(오버로딩)할 수 있다.
  • 생성자는 new를 통해 객체를 생성할 때 한 번만 호출된다.
  • 생성자에 리턴 타입 지정할 수 없다.
  • 생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다.
  • 생성자가 없는 클래스는 있을 수 없다.

 

기본 생성자(default constructor)

매개변수와 실행코드가 없어 아무 일도 하지 않고 단순 리턴하는 생성자.

class Circle{
	public Circle(){}//기본생성자. 매개변수 없고 단순 리턴
}

 

 

this 레퍼런스

객체 자신을 가리키는 레퍼런스

 

*this 기초 개념

- 객체 자신에 대한 레퍼런스. 즉 현재 실행되고 있는 메소드가 속한 객체에 대한 레퍼런스.

public class Circle{
	int radius;
    public Circle(int r){this.radius=r;}
    public int getRadius(){return radius;}
}

this는 현재 객체에 대한 레퍼런스이므로, this.radius는 현재 객체의 멤버 radius에 접근

 

*this의 필요성

public Circle(int radius){ this.radius/*멤버 radius*/=radius/*매개변수 radius*/;}

*this()

클래스 내에서 생성자가 다른 생성자 호출할 때 사용하는 자바 코드.

public class Book{
	String title;
    String author;
    
    void show(){System.out.println(title+" "+author);
    
    public Book(){
    	this("","");
        System.out.println("생성자 호출됨");
    }

	public Book(String title){
    	this(title,"작자미상");
    }
    
    public Book(String title, String author){
    	this.title=title;
        this.author=author;
    }
}

주의할 점

  • this()는 반드시 생성자 코드에서만 호출 가능
  • this()는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용
  • this()는 반드시 생성자의 첫 번째 문장이 되어야 함.

 

 

4.4 객체 배열

객체에 대한 레퍼런스를 원소로 갖는 배열.

Circle[] c;//Circle배열에 대한 레퍼런스 변수 c 선언
c=new circle[5];//레퍼런스 배열 생성

for(int i=0;i<c.length;i++)//c.length는 배열 c의 크기로서 5
	c[i]=new Circle(i);//배열의 각 원소 객체 생성

 

 

4.5 메소드 활용

메소드는 클래스의 멤버 함수.

 

메소드 오버로딩(method overloading)

한 클래스 내에 이름이 같지만 매개변수 타입이나 개수가 서로 다른 여러 개의 메소드를 중복 작성 하는 것.

  • 메소드 이름이 동일해야 함
  • 매개변수의 개수나 타입이 서로 달라야 함.

*성공 사례

class MethodOverloading{
	public int getSum(int i, int j){
    	return i+j;
    }
    
    public int getSum(int i, int j, int k){
    	return i+j+k;
    }
}

*실패 사례

class MethodOverloading{
	public int getSum(int i, int j){
    	return i+j;
    }
    
    public double getSum(int i, int j){
    	return (double)i+j;
    }
}

 

 

4.6 객체의 소멸과 가비지 컬렉션

객체 소멸

new에 의해 생성도니 객체 공간을 자바 가상 기계에 돌려줘 가용 메모리(available memory)에 포함시키는 것.

- C++에서는 delete 연산자

- Java에서는 유사하게 finalize()있지만 delete 연산자, 소멸자 다 없음. ->자바 장점

 

가비지 컬렉션

더이상 참조되지 않는 가비지를 회수해 가용 메모리 늘리는 것.

*가비지 컬렉션 강제 요청

System.gc();

 

 

4.7 접근 지정자

패키지(package)

자바는 서로 관련 있는 클래스 파일들을 패키지(package)에 저장해서 관리.

디렉토리, 폴더와 같은 개념.

 

자바의 4가지 접근 지정자(access specifier)

자바에는 private, proteced, public, 접근 지정자 생략(디폴트 접근 지정)의 4 가지 접근자가 있음.

 

 

*클래스 접근 지정

다른 클래스에서 이 클래스 활용할 수 있는지 허용 여부를 지정하는 것.

 

  • public 클래스

패키지 상관 없이 다른 어떤 클래스에게도 사용이 허용됨.

public class World{
	...
}
  • 디폴트 클래스(접근 지정자 생략)

같은 패키지 내의 클래스들에게만 사용이 허용 됨.

class Local{
	...
}

 

*멤버 접근 지정

pivate<default<protected<public 순으로 공개 범위 넓어짐.

멤버에 접근하는 클래스 멤버의 접근 지정자
private default protected public
같은 패키지의 클래스 x o o o
다른 패키지의 클래스 x x x o
접근 가능 영역 클래스 내 동일 패키지 내 동일 패키지와 자식 클래스 모든 클래스
  • public 멤버

패키지 막론하고 모든 클래스들이 접근 가능.

 

  • private 멤버

비공개를 지시. 클래스 내의 멤버들에게만 접근이 허용됨.

 

  • protected 멤버

보호된 공개를 지시.

1. 같은 패키지의 모든 클래스에 접근 허용

2. 다른 패키지에 있더라도 자식 클래스의 경우 접근이 허용

 

  • 디폴트 멤버(default 또는 package-private)

접근 지정자 생략된 멤버.

동일한 패키지 내에 있는 클래스들만 디폴트 멤버를 자유롭게 접근 가능.

 

 

4.8 static 멤버

눈은 각 사람마다 있고 공기는 모든 사람이 소유(공유)함

- 여기에서 눈은 사람이라는 객체의 non-static 멤버, 공기는 static 멤버

- 공기는 오직 하나만 있고 모든 사람이 공유함.

 

  non-static 멤버 static 멤버
선언 class Sample{
      int n;
      void g(){...}
}
class Sample{
      static int m;
      static void g(){...}
}
공간적 특성 멤버는 객체마다 별도 존재
- 인스턴스 멤버라고 부름
멤버는 클래스당 하나 생성
- 멤버는 객체 내부가 아닌 별도의 공간(클래스 코드가 적재되는 메모리)에 생성
- 클래스 멤버라고 부름
시간적 특성 객체 생성 시 멤버 생성됨
- 객체가 생길 때 멤버도 생성
- 객체 생성 후 멤버 사용 가능
- 객체가 사라지면 멤버도 사라짐
클래스 로딩 시에 멤버 생성
- 객체가 생기기 전에 이미 생성
- 객체가 생기기 전에도 사용 가능
- 객체가 사라져도 멤버는 사라지지 않음
- 멤버는 프로그램이 종료될 때 사라짐.
공유의 특성 공유되지 않음
- 멤버는 객체 내의 각각 공간 유지
동일한 클래스의 모든 객체들에 의해 공유됨.

 

static의 활용

- 전역변수와 전역함수 만들 때 활용

Java에서는 C++과 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없으며 클래스 멤버로 존재해야 함(캡슐화).

모든 클래스에서 공유하는 전역변수나 모든 클래스에서 호출가능한 전역함수 필요한 경우 static 사용.

 

static 제약조건

  • static 메소드는 static 멤버만 접근 가능
  • static 메소드는 this 사용 불가능.-객체 없이도 존재하기 때문에.

 

4.9 final

  • final 클래스

클래스를 상속받을 수 없음을 지정.

 

  • final 메소드

오버라이딩 할 수 없는 메소드임을 선언.

 

  • final 필드

필드는 상수가 됨.

상수 필드는 한 번 초기화되면 값을 변경할 수 없음.

댓글