Coding(Java)/Java(이론)2021. 9. 2. 08:00
반응형

[Java] 13. 클래스의 정의와 메소드

 

 

프로그래밍 현실세계
객체 (설계도 기반)완성된 건물
클래스 설계도

위 표는 프로그래밍의 세계와 현실세계를 비교한 표이다.

설계도가 있어야 건물을 만들 수 있듯이 프로그래밍에 있어서도 잘 만들어진 클래스가 있다면 똑같은 객체를 만들 수 있다(재활용).

프로그래밍에서의 객체는 현실세계의 설계도 기반으로 완성된 건물에 대응되고, 클래스는 설계도에 대응된다(객체의 속성과 행위를 선언). 객체의 본질적인 특징은 외부로부터 보호하는 기능(캡슐화, 정보은닉)을 갖추고 있다.

(TV, 의자, 책, 집, 카메라, 컴퓨터 등의 세상 모든 것은 객체이며 객체마다 고유한 특성과 행동을 가지고 상호작용한다)

 

객체지향 프로그래밍은 속성과 동작을 하나의 객체로 정의하고 이러한 객체를 중심으로 이루어지는 설계이다. 

객체지향의 특징은 자판기라고 봐도 된다.

*절차지향(객체지향의 반대) 프로그램은 작업 순서를 표현하는 컴퓨터 명령 집합으로 알고리즘에서의 순서도를 생각하면 된다.

*객체지향 언어의 목적

1. 소프트웨어의 생산성 향상(컴퓨터 산업 발전에 따라 소프트웨어 생명주기 단축)

2. 실세계에 대한 쉬운 모델링

초기 프로그래밍은 수학 계산 또는 통계 처리를 목적으로 하기 때문에 계산 절차를 중요하게 여기나 현대에는 산업 전반에 활용되고 실세계에서 발생되는 일을 프로그래밍 한다. 

객체 지향 언어는 실세계의 일을 쉽게 프로그래밍하기 위한 객체 중심적 언어이다.

 

객체를 생성하기 위해서는 클래스의 구조를 알고 작성할 수 있어야 한다. 다음은 클래스의 구조이다.

[클래스 이름(클래스 헤더)]
[변수
상수  (속성)(멤버 필드)]
생성자
[메소드(동작)(멤버 메소드)]

클래스 헤더부분은 클래스를 선언하는 부분이다. class라는 예약어를 중심으로 오른쪽에 클래스명을, 왼쪽에는 접근권한과 클래스의 형태, 종류를 나타낸다.

 

[접근제한][클래스 종류] class 클래스명

[접근제한]: 사용 권한을 결정한다. public, protected, default, private 네 가지가 있는데 

public은 모든 접근을 허용하고, protected는 같은 패키지(폴더)안에 있는 객체와 상속 관계의 객체들만 허용하고, default는 같은 패키지 안에 있는 객체들만 허용하고, private은 현재 객체 안에서만 허용한다.

*super클래스와 sub클래스는 서로 상속관계에 있고 super클래스는 부모로, sub클래스는 자식으로 보면 된다(자세한 건 생략).

[클래스 종류]: 최종(final)클래스 또는 추상(abstract)클래스와 같은 클래스 종류를 의미한다. 없으면 일반 클래스이다.

클래스명: 클래스명을 의미하는데 기본 문법에 맞추어진 이름으로 작성한다.

 

멤버 필드부분은 변수와 상수(자료)라고 하는데 필드는 static과 instance가 있다.

변수는 프로그램이 실행되는 동안 변경될 수 있고, 상수는 고정된 값으로 프로그램이 종료될 때까지 변하지 않는다. 

 

생성자는 객체가 생성될 때 초기화 목적으로 실행되는 메소드로 객체가 생성되는 순간에 자동으로 호출된다(객체는 생성자에 의해 만들어진다). 

 

메소드는 특정한 일을 실행하는 행위(동작)이다. 멤버필드들의 값을 이용해 작업을 수행할 수 있고, 메소드에도 static메소드(클래식 메소드)와 instance메소드 이 두 가지가 있다. 

static메소드는 메소드를 갖는 객체를 생성하지 않아도 사용할 수 있으나 instance메소드는 객체를 생성해야만 사용할 수 있다. 

클래스의 구성 요소들을 멤버라고 한다. 

 

다음은 메소드의 구성이다. 

[접근제한][반환형][메소드명](자료형인자1, 자료형인자2, ...) {
                      실행문1;
                      실행문2;
                      ...;
              }

[접근제한]: 앞에서 설명한 접근제한과 똑같이 public, protected, default, private 네 가지가 있다.

[반환형]: 메소드에서 할 일을 모두 끝내고 마지막으로 메소드 자신을 불러준 곳으로 반환하는 값의 자료형을 의미한다. 없으면 void로 대체해야 한다.

[메소드명]: 사용자가 정의하는 이름이다.

(인자): 메소드를 호출할 때 필요에 따라 특정한 값을 제공하기 위해 미리 선언한다. 메소드를 호출할 때 반드시 인자의 자료형과 수(변수의 개수)가 일치해야 한다.

실행문: 식 실행문 또는 제어문 등이다. 

 

클래스 멤버들은 자료형을 갖는다. 자바의 자료형에는 기본 자료형과 참조 자료형(객체 자료형) 두 가지로 나눌 수 있다.

기본 자료형은 정수형, 실수형, 문자형 등과 같은 자료형이고,  

참조 자료형은 자바 내부에서 제공되는 클래스, 프로그래머에 의해 만들어진 사용자 정의 클래스등을 자료형으로 한다.

 

public class Circle {
    int radius;
    String name;

    public double getArea() {
        return 3.14*radius*radius;
    }
}

위의 프로그램에서 public은 접근제한이고, abstract도 final도 아니므로 일반클래스, 클래스 이름은 Circle이다.

여기까지 클래스 헤더이고,

int, String형태로 정의된 변수 부분은 멤버 필드, public부터 radius;사이 부분은 메소드이다.

 

객체 생성

 

1단계: 다음과 같이 객체를 선언한다.

Calculator computer;

메모리에서 변수 같은 가벼운 것들이 저장되는 stack영역에 만들어진다

 

2단계: 선언된 변수에 객체를 생성해야 한다.

computer=new Calculator(); () 

new 연산자를 통해 메모리 안에 공간을 할당받고 Calculator클래스의 생성자를 통해 객체를 생성한다. 여기서 computer가 참조변수이다.

 

*메모리 공간은 크게 stack, heap, static 세 영역으로 나뉜다. stack은 변수와 같이 가벼운 것들을 저장하는 공간이고 heap은 내부에 참조영역(registry)을 따로 가지므로 객체와 같은 무거운 것들을 저장하는 공간이고, static은 정적인 값들만 저장하는 공간이고 한 번 생성되면 같은 것은 두 번 다시 만들어지지 않는다.

객체의 참조변수(reference)를 통해 '.(dot)'을 사용해 해당 객체의 메소드나 변수(멤버들)를 접근할 수 있다.

[객체참조.멤버이름]형식으로 사용된다. 

위 그림에서 Calculator라는 클래스의 메소드 중 더하는 기능plus(int n1, int n2)를 다음과 같이 사용할 수 있다.

 

computer.plus(2,3);

 

여기서 사용된 computer가 Calculator클래스가 생성되어 그 객체의 참조변수를 갖는 변수이다.

생성된 Calculator객체를 computer가 참조하게 되고, 이것을 통해 인자(Arguments)값으로 2와 3을 전달해 plus(,)함수를 호출해 하나의 멤버변수에 누적시키는 동작을 한다. 

 

멤버변수

 

멤버변수에는 instance변수와 static변수가 있는데 이 두 변수들은 객체가 생성될 때 객체의 특징과 속성을 저장하는 곳으로 자료, 멤버필드, 멤버변수들이 속하고 모두 같은 의미를 지닌다.

그러나 참조변수와 static변수의 목적과 생성되는 시기 등은 두 형태가 완전히 다르다.

 

instance변수: 하나의 클래스로 여러 개의 객체가 생성될 때 각 객체들마다 따로 생성되어 고유의 값을 받은 다음 각 객체의 속성으로 자리잡는 변수이다.

위의 그림의 Calculator에 있는 int n1, n2에서의 n1, n2가 instance변수이다(객체를 생성해야 사용가능).

 

static변수: 하나의 클래스로 여러개의 객체가 생성될 때 단 하나만 생성되며 모든 객체들이 공유하여 사용하는 변수이다.  

반응형

'Coding(Java) > Java(이론)' 카테고리의 다른 글

[Java] 15. 배열(1)  (0) 2021.09.24
[Java] 14. 메소드 예제  (0) 2021.09.09
[Java] 12. 다중반복문, break&continue label  (0) 2021.08.31
[Java] 11. do-while문, continue문  (0) 2021.08.30
[Java] 10.while문  (0) 2021.08.25
Posted by skywalker222