안녕, 세상!

4. 클래스와 객체 본문

It공부/Java

4. 클래스와 객체

dev_Lumin 2020. 7. 10. 17:27

객체지향 언어는 구조체와 메소드를 하나로 통합하여 관리함으로써 대단위의 프로그램을 개발하는데 능동적이고 효율적인 프로그램을 구현할 수 있습니다.

또한 자바와 같은 객체지향 언어의 경우 다른 클래스의 기능을 사용하기 위해서는 컴파일된 상태의 클래스를 사용하므로 소스 코드의 수정이 불가능하므로 정보의 보호 기능이 향상되었습니다.

객체 지향 언어의 가장 특징은 클래스의 상속이 있습니다.

 

객체지향 언어의 장점

① 프로그램 작성의 편리성

② 프로그램의 안전성

 - 정보보호 기능이 잘 되어 있으므로 클래스의 소스코드는 변경이 불가능합니다.

③ 일상생활 속의 모델링

④ 클래스 상속의 재사용

 - 상속은 기존에 존재하는 클래스를 바탕으로 기능을 추가하여 개선된 클래스를 만들 수 있습니다.

⑤ 유지보수의 용이함

 - 프로그램이 객체 단위로 되어 있어서 어느 부분이 문제가 있는지 찾기 쉽습니다.

 

 

 

 

(1) 클래스와 객체

클래스와 객체에 관계에 대해서 파이썬 클래스부분에서도 언급했듯이 예시를 들어서 설명하자면 다음과 같습니다.

 

붕어빵 틀 -> 클래스(class)

붕어빵 틀에 의해서 만들어진 붕어빵 -> 객체(object)

 

클래스는 똑같은 무엇인가를 계속해서 만들 수 있는 설계 도면(붕어빵 틀)이고, 객체는 클래스로 만들어진 존재(붕어빵)입니다.

 

클래스의 기본 구조는 다음과 같습니다.

 

클래스를 모듈화시키기 위해서 main() 메소드가 포함되어 있는 클래스와 주요 기능이 포함되어 있는 클래스를 분리시켜서 주로 사용합니다.

다음은 그 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Scanner;
class Sum{
    int result;
    int a,b;
    int addnum(int a,int b) {
        result=a+b;
        return result;
    }
}
public class classSum {
    public static void main(String[] args) {
        int n1,n2,r1;
        Sum a;
        a= new Sum();
        Scanner s=new Scanner(System.in);
        System.out.print("첫번째 수를 입력하시오:");
        n1=s.nextInt();
        System.out.print("두번째 수를 입력하시오:");
        n2=s.nextInt();
        r1=a.addnum(n1, n2);
        System.out.println("두 수의 합은 "+r1+"입니다.");
    }
}
cs

위의 코드에서는 Sum과 classSum의 2개의 클래스가 존재합니다.

클래스 Sum을 이용해 변수 a를 객체로 시켜서 사용했습니다.

classSum 클래스에는 main() 메소드가 있으며 Sum 클래스를 객체로 생성하여 두 정수의 합을 구할 수 있습니다.

 

 

 

 

 

 

(2) 메소드 오버 로딩(Overloading)

자바에서는 하나의 클래스 안에 이름이 같은 함수 2개 이상 중복해서 정의하여 사용할 수 있습니다.

이를 메소드 오버 로딩이라고 하며, 다음의 조건을 모두 만족하여야 합니다.

1. 메소드의 이름이 동일합니다.

2. 메소드의 인수의 개수가 다르거나, 혹은 인수의 타입(type)이 달라야 합니다.

 

다음은 메소드 오버 로딩의 예시입니다.

Sum 클래스에서 addnum의 메소드가 이름이 중복되어 두 개나 있지만 인수가 서로 다르므로 메소드 오버 로딩으로 정상적으로 작동합니다.

 

 

 

 

(3) 생성자

생성자는 클래스를 객체로 생성할 때 객체의 속성 값들을 초기화하는 역할을 하는 메소드로 다음과 같은 특징을 갖습니다.

1. 클래스의 이름과 동일한 이름을 갖는 메소드입니다.

2. 객체를 생성할 때 자동으로 실행됩니다.

3. 객체의 성질을 결정하는 속성 값들을 초기화하는 역할을 수행합니다.

4. 반환 값이 없으며, void 유형도 지정하지 않습니다.

 

인수가 있는 생성자의 예시는 다음과 같습니다.

 

 

 

(4) 접근 지정자

접근 지정자는 자바에서 객체를 캡슐화(모듈화) 하기 때문에 한 객체를 다른 객체가 접근하는 것을 허용하는 방식을 지정한 것입니다.

접근 지정자의 종류는 네 가지로 private, protected, public, 접근 지정자 생략(default)이 있습니다.

 

① 클래스에 대한 접근 지정자

다른 클래스에서 해당 클래스 기능을 사용할 수 있는지 허용 여부를 지정하는 것을 말합니다.

종류는 두 가지로 public, 접근 지정자 생략(default)이 있습니다.

 

(1) public 클래스 접근 지정자

public 접근 지정자로 선언된 클래스는 어떤 클래스에도 해당 클래스를 객체로 만들어 사용할 수 있습니다.

즉, 다른 패키지에 속한 클래스에서도 사용 가능합니다.

 

(2) 접근 지정자 생략(default)

접근 지정자를 생략하고 클래스를 정의하는 경우이며, 같은 패키지에 있는 클래스만이 default 접근 지정자로 정의된 클래스에 사용할 수 있습니다.

다른 패키지에 있는 클래스에서는 사용이 불가능합니다.

 

 

 

② 멤버 접근 지정자

클래스 자체뿐만 아니라 클래스를 구성하는 멤버 변수나 각각의 메소드에 대해서도 접근 지정자를 지정할 수 있습니다.

멤버에 대한 접근 지정자는 클래스에 대한 접근 지정자와는 달리 다음과 같이 4가지 종류가 존재합니다.

 

멤버에 접근하는 클래스 멤버의 접근 지정자
default private protected public
같은 패키지의 클래스 o x o o
다른 패키지의 클래스 x x x o

 

 

 

 

 

(5) 객체지향 관련 기타 문법

① this와 this()

자바 언어에서 this는 클래스나 객체 자신을 의미합니다.

객체지향 언어를 이용한 프로그래밍에서는 클래스로 객체를 여러 개 생성할 수 있으므로 각 객체에 대한 구분이 모호한 경우도 많이 발생합니다.

이러한 경우에 this를 사용할 수 있으며, 용도가 다양합니다.

 

(1) 객체 자신을 의미하는 this

다음 예제는 멤버 변수와 메소드에서 사용하는 변수의 이름이 같은 경우 발생할 수 있는 문제점을 보여줍니다.

construct 클래스에서 멤버 변수 a와 메소드 sq의 인수 a가 같아서 다음과 같은 문제점이 발생합니다.

이러한 경우 객체가 자신의 멤버 변수임을 나타내기 위하여 this를 사용하여 문제를 해결할 수 있습니다.

this.a의 this의 의미는 construct 클래스를 뜻하는 것이므로 this.a는 construct 클래스의 멤버 변수를 뜻합니다.

 

 

(2) 객체 자체를 인수로 사용할 때의 this

sqsq의 클래스의 sq메서드는 ShowResult라는 메서드를 이용해서 결과를 출력합니다.

ShowResult 메서드는 sqsq클래스를 객체로 가진 변수를 인수로 가지기 때문에 sq 메소드에서 ShowResult를 부를 때 객체 값을 넣어야 하는데 이때 자기 자신 객체를 의미하는 this를 사용해서 값을 출력할 수 있습니다.

 

 

(3) 생성자를 호출할 때의 this()

this()는 한 클래스 내에서 다른 생성자를 호출할 때 사용하는 자바 메소드입니다.

생성자의 경우에도 앞서 설명한 것처럼 오버 로딩이 가능합니다.

다음은 생성자 2개인 경우 this()를 이용한 예시입니다.

인수가 없는 첫 번째 생성자에서 this(10); 를 실행시킴으로써 Test 클래스의 인수를 가지고 있는 또 다른 생성자에 10을 대입하여 실행시킴을 알 수 있습니다.

 

 

 

② 인스턴스 변수와 클래스 변수

자바의 클래스에 멤버 변수는 인스턴스 변수클래스 변수, 2가지 형태가 존재합니다.

인스턴트 변수는 일반적으로 많이 사용되는 변수로 클래스를 이용하면 객체를 생성하게 되면, 각각의 객체마다 별도의 공간으로 생성되어 독립적으로 사용이 가능한 변수입니다.

반면, 클래스 변수는 객체마다 생성되는 것이 아니라 클래스에 한 개만 존재하는 변수입니다.

즉, 클래스 변수는 여러 개의 객체에서 동일한 값으로 동작하며 객체가 사라지더라도 클래스 변수는 프로그램이 종료될 때까지 존재합니다.

 

다음은 인스턴스 변수와 클래스 변수의 차이를 알 수 있는 예시입니다.

 

 

 

③ final 키워드

(1) final 클래스

클래스 이름 앞에 final 키워드가 붙으면 이 클래스는 상속받을 수 없습니다.

 

final class ABC {

   ....

   ....

}

 

 

(2) final 메소드

메소드의 이름 앞에 final 키워드가 붙으면 이 메소드는 더 이상 오버라이딩 할 수 없게 됩니다.

오버라이딩이란 메소드를 다시 정의하는 것으로 클래스를 상속받았을 때 기존의 클래스에 있던 메소드에 새로운 기능을 추가하거나 변경하기 위해 같은 이름의 메소드를 재정의 하는 것을 말합니다.

즉, 자식 클래스가 부모 클래스의 특정 메소드를 오버라이딩 하지 못하게 하고 무조건 상속받아 사용하도록 할 때 사용됩니다.

 

 

(3) final 멤버 변수

멤버 변수 이름 앞에 final 키워드가 붙으면 해당 변수의 값은 변경될 수 없는 상수를 의미합니다.

 

 

 

 

 

'It공부 > Java' 카테고리의 다른 글

6. 윈도우 프로그래밍  (0) 2020.07.12
5. 클래스 상속  (0) 2020.07.11
3. 자바 문법 기초2  (0) 2020.07.09
2. 자바 문법 기초  (0) 2020.07.07
1. java 기본 및 설치  (0) 2020.07.05
Comments