JAVA 클래스와 객체

전홍영·2022년 1월 21일
0

Java

목록 보기
3/15
post-thumbnail

객체 지향과 객체
객체 지향 언어의 특성
1. 캡슐화(Encapsulation)

  • 캡슐화란 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것으로 객체의 본질적 특징이다.
  • 자바에서 객체는 클래스(class)라는 캡슐을 사용하며, 필드(멤버 변수)와 메소드(멤버 함수)로 구성된다.
  1. 상속(Inheritance)
  • 자바의 상속은 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장(extend)하는 개념이다.
  • 자바에서 부모 클래스를 슈퍼 클래스(super class)라 부르며 자식 클래스를 서브 클래스(sub class)라고 부른다.
  • 상속을 함으로서 코드를 재사용하여 코드 작성에 드는 시간과 비용을 줄인다.
  1. 다형성(Polymorphism)
  • 다형성은 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것을 말한다.
  • 슈퍼 클래스에 구현된 메소드를, 서브 클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 것을 오버라이딩(overriding)이라 한다.
  • 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러 개 만드는 메소드 오버로딩(overloading)이 있다.

객체 지향 언어의 목적

  • 소프트웨어의 생산성 향상
  • 실세계에 대한 쉬운 모델링
  • 객체지향언어는 절차지향언어의 단점을 보완하고 위와 같은 목적을 달성하기 위해 탄생하였다.
  • 클래스
  1. 클래스의 구성
  • 자바 클래스는 class 키워드를 사용하여 클래스를 선언한다.
  • 클래스의 구성 요소를 멤버라 부르며 필드(멤버 변수)와 메소드(멤버 함수)가 이 멤버이다.
public class Circle {
	public int radius;
	public String name;
	public Circle(){
	}
	public double getArea(){
		return 3.14*radius*radius;
	}
}
  • 클래스 선언, class Circle
    class 키워드와 클래스 이름으로 선언하고 중괄호 안에 필드와 메소드를 작성한다.
    클래스 밖에는 어떠한 메소드나 필드를 둘 수 없다.
  • 필드와 메소드
    객체 내에 값을 저장할 멤버 변수를 필드라 부른다.
    메소드는 함수이며 객체의 행동을 구현한다.
  • 접근 지정자
    필드, 메소드에 붙은 public을 접근 지정자라 하며 이는 다른 클래스에서 활용하거나 접근할 수 있음을 선언한다.
    접근 지정자를 생략할 때 디폴트 접근이라 부른다.
    *생성자(constructor)
    클래스 이름과 동일한 메소드를 특별히 생성자라 한다. 생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메소드이다.
  1. new 연산자와 객체 생성, 그리고 레퍼런스 변수
  • 레퍼런스 변수 선언
    객체를 생성하기 전에 객체를 가리킬 레퍼런스 변수를 먼저 선언한다.
  • 객체 생성, new 연산자 사용
    자바에서는 반드시 new 연산자를 사용하여 객체를 생성한다.
    new 연산자에 의해 메모리를 할당하고 생성자 코드를 실행한다.
  • 객체 멤버 접근
    객체의 멤버에 접근할 때는 레퍼런스 뒤에 점(.) 연산자를 붙인다.
  1. 생성자
  • 생성자의 개념과 목적
    생성자는 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드이다.
  • 생성자 선언 및 활용
    생성자의 이름은 클래스 이름과 동일하다.
    생성자는 여러 개 작성(오버로딩)할 수 있다.
    생성자는 new를 통해 객체를 생성할 때 한 번만 호출된다.
    생성자에 리턴 값을 지정할 수 없다.(리턴 값이 없다고 void를 리턴 타입으로 지정하면 안된다.)
    그러나 return 무능ㄹ 사용할 수 없는 것은 아니다. 생성자의 실행을 끝내고자 하면 생성자 코드 내 어디서든 return 문을 사용하면 된다.
    생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다.
    초기 작업이란 객체가 생성될 때 필드 초기화, 필요한 메모리 확보, 파일 열기, 네트워크 연결 등을 의미한다.
  • 기본 생성자
    기본 생성자(default constructor)란 매개변수와 실행 코드가 없어 아무 일도 하지 않고 단순 리턴하는 생성자이다.
    자바 컴파일러는 클래스에 생성자가 없으면 자동으로 기본 생성자를 사용자 눈에 보이지 않게 삽입한다.
    생성자가 하나라도 존재하는 클래스에는 컴파일러가 기본 생서자를 삽입해 주지 않는다.(개발자의 의도를 지켜주기 위해)
  • this 레퍼런스
    this는 단어 뜻 그대로 객체 자신을 가리키는 레퍼런스이다.
    매개변수의 이름과 멤버 변수의 이름이 동일한 경우 둘다 매개변수에 접근하기 때문에 멤버 변수를 변경하지 못할 때 this 레퍼런스를 이용하면 된다.
    메소드가 객체 자신의 레퍼런스를 리턴해야 하는 경우 this를 리턴하면 된다.
  • this로 다른 생성자 호출
    this()는 클래스 내에서 생성자가 다른 생성자를 호출할 때 쓰는 자바 코드이다.(참고글 https://lowelllll.github.io/java/2018/12/09/java-this-%EC%B0%A8%EC%9D%B4%EC%A0%90/)
    this() 사용시 주의 사항
    (1) this()는 반드시 생성자 코드에서만 호출될 수 있다.
    (2) this()는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용된다.
    (3) this()는 반드시 생성자의 첫 번째 문장이 되어야 한다.
  1. 메소드 활용
  • 메소드 형식
    (접근 지정자) (리턴 타입) (메소드 이름) (메소드 인자){ 메소드 코드 }
  • 인자 형식(매개 변수)
    자바의 메소드 호출 시 인자 전달 방식(argument passing)은 '갑에 의한 호출(call-by-value)이다.(call-by-value 참조글 : https://devlog-wjdrbs96.tistory.com/44)
    기본 타입이 전달되는 경우 호출자가 건네는 값이 매개변수에 복사되어 전달된다.
    객체가 전달되는 경우 객체가 전달되는 것이 아니라 객체의 레퍼런스 값이 전달된다.
    배열이 전달되는 경우 배열이 통째로 전달되는 것이 아니라 레퍼런스만 전달된다.
  • 메소드 오버로딩
    자바에서 한 클래스 내에 이름이 같지만 매개변수 타입이나 개수가 다른 여러 개의 메소드를 중복 작성할 수 있는데, 이를 메소드 오버로딩 또는 메소드 중복이라 한다.
    메소드 오버로딩을 하기 위해서는 메소드 이름이 동일해야 하며, 매개변수의 개수나 타입이 서로 달라야 한다.
  1. 객체의 소멸과 가비지 컬렉션
  • 객체의 소멸
    자바에서는 객체를 생성하는 new 연산자는 있지만 객체를 소멸시키는 연산자는 없다. 따라서 개발자는 마음대로 객체를 소멸시킬 수 있다.
    객체 소멸이란 new에 의해 생성된 객체 공간을 jvm에게 돌려주어 가용메모리에 포함시키는 것이다.
    사용하지 않게 된 메모리(가비지)는 jvm의 가비지 컬렉션(gabage collector)가 적절한 시점에 자동으로 수집하여 가용 메모리에 반환시킨다.
  • 가비지
    가비지란 자바 응용프로그램에서 더 이상 사용되지 않게 된 객체나 배열 메모리이다.
    참조하는 레퍼런스가 하나도 없는 객체나 배열을 가비지로 판단한다.
  • 가비지 컬렉션
    가비지가 차지하고 있는 메모리 공간은 회수되어야 한다. 왜냐하면 가비지가 많아지면 자바 플랫폼이 응용프로그램에게 할당해줄 수 있는 가용 메모리 양이 줄어들기 때문이다.
    자바 플랫폼은 가용 메모리가 일정 크기 이하로 줄어들면 자동으로 가바지를 회수하여 가용 메모리를 늘린다. 이를 가비지 컬렉션이라고 부르며, 가비지 컬렉션은 자바 플랫폼에 의해 준비된 가비지 컬렉션 스레드에 의해 처리된다.
    가비지가 많아져 가비지 컬렉터가 실행되어 응용프로그램을 멈추고 가비지 컬렉션이 끝나기를 기다릴 수 있기 때문에 자바는 실시간 처리 응용에는 부적합하다.(새로운 기술의 발전으로 다른 언어와 비슷해 졌다...?)
  • 가비지 컬렉션 강제 요청
    응용프로그램에서 System 또는 Runtime 객체의 gc() 메소드를 호출하면 가비지 컬렉션을 요청할 수 있다.
    ex) System.gc();
    그러나 이 문장을 호출한 즉시 가비지 컬렉션이 작동하는 것이 아니라 이는 필요하다는 요청일 뿐 자바 플랫폼이 판단하여 적절한 시점에 작동시킨다.
  1. 접근 지정자
  • 패키지
    자바는 서로 관련 있는 클래스 파일들을 패키지(package)에 저장하여 관리하도록 한다.
    패키지는 디렉토리 혹은 폴더와 같은 개념이며, 개발자는 클래스 파일들을 여러 패키지로 분산 관리하는 것이 일반적이다.
  • 자바의 4가지 접근 지정자
    (1) private
    (2) protected
    (3) public
    (4) default(접근 지정자 생략)
  • 클래스 접근 지정
    클래스 접근 지정이란 다른 클래스에서 이 클래스를 활용할 수 있는지 허용 여부를 지정하는 것을 말한다.
    클래스 이름 앞에 public으로 선언된 클래스는 패키지에 상관없이 다른 어떤 클래스에게도 사용이 가능하다.
    디폴트 클래스는 같은 패키지 내의 클래스들에게만 사용이 허용된다.
    *멤버 접근 지정
    (1) public - public 멤버는 패키지를 막론하고 모든 클래스들이 접근 가능하다.
    (2) private - private 접근 지정자는 비공재를 지시하는 것으로, private 멤버는 클래스 내의 멤버들에게만 접근이 허용된다.
    (3) protected - protected 접근 지정자는 보호된 공개를 지시하는 것으로 같은 패키지의 모든 클래스에 접근이 가능하고 다른 패키지에 있더라도 자식 클래스의 경우 접근이 허용된다.
    (4) default - 동일한 패키지 내에 있는 클래스들만 디폴트 멤버를 자유롭게 접근할 수 있다.
  1. static 멤버
  • non-static과 static의 차이

    static 멤버는 클래스당 하나씩 생긴다고 해서 클래스멤버라고 부르면 non-static 멤버는 각 객체마다 하나씩 생긴다고 해서 인스턴스 멤버라고 부른다.
  • static 멤버는 객체가 생성되기 전에 생성되어 있기 때문에 클래스명.static 멤버로 접근 가능하다.
  • static의 활용
    전역 변수와 전역 함수를 만들 때 static이 이용된다. java는 캡슐화를 원칙으로 하기 때문에 class밖에 함수나 변수를 선언할 수 없는데 static을 통하여 이를 해결할 수 있다.(ex. java.lang.Math)
    또한 공유멤버를 만들고자 할 때 이용된다. static으로 선언된 필드나 메소드는 하나만 생성되어 클래스의 객체들 사이에서 공유된다.
  • static 메소드의 제약 조건
    static 메소드는 static 멤버만 접근 가능하다. non-static 메소드는 static 멤버들을 사용할 수 있다.
    static 메소드는 this를 사용할 수 없다. static은 객체가 존재하지 않기 때문에 this를 사용할 수 없다.
  1. final
  • final 클래스
    final이 클래스 이름 앞에 사용되면 클래스를 상속 받을 없음을 지정한다.
  • final 메소드
    final로 메소드를 선언하면 오버라이딩을 할 수 없는 메소드임을 지정한다.
  • final 필드
    final로 필드를 선언하면 필드는 상수가 된다.
    상수 필드는 한 번 초기화되면 값을 변경할 수 없다.

이상 java class에 대한 간단한 기본 개념들을 다시 상기시키기 위해 정리해 보았다. 위의 내용을 깊게 들여보지는 않았지만 간단하게 코딩하는데는 큰 무리는 없을 정도만 됬으면 좋겠다.

profile
Don't watch the clock; do what it does. Keep going.

0개의 댓글