Webdeveloper_kim 2022. 1. 17. 19:46
728x90

어제에 이어 객체지향을 이어서 나간다. 새로운 용어가 물밀듯 들어올 예정이니 확실하게 이해하고 넘어가자.

 

 

어제 했던 예제와 비슷한 Tv예제이다.

여기서 가장 실수가 많고 중요한 부분은 배열을 생성한 후에, 인스턴스를 생성해 대입해주어야 한다는 것이다.

사실 상당히 간단한 예제이지만, 코딩할때마다 주석으로 메모해놓은 부분을 꼭 살펴야 한다.

 

클래스의 또다른 정의 ( 장점 )

클래스는 객체를 생성하기 위한 틀. 즉, 설계도같은 것이라 정의했지만 프로그래밍적인 관점에서는 또 다른 의미도 가지고 있다.

클래스는 데이터와 함수의 결합으로 이루어질수 있다. 문자열을 단순히 문자의 배열로 정의하지 않고 클래스로 정의한 이유는 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶이 위함이다.

또한 Tv예제에서 보았듯이 사용자가 직접 class를 만들 수 있다. 기본형의 개수는 8개로 정해져 있지만 참조형의 개수가 정해져있지 않은 이유는 이처럼 프로그래머가 새로운 타입을 추가할 수 있기 때문이다.

 

클래스에 마우스를 가져다 대고 Ctrl을 누르면 해당 클래스가 어디에 정의되어있는지, 설계되어있는지 볼 수 있다.

만약 안보이면 아래의 순서대로 설정해놓으면 된다.

attach source > external location > external file > jdk폴더의 src.zip 선택 후 ok

이렇게 설정하고 나면 기존에 이미 설정되어있는 클래스에 대한 정보도 볼 수 있다.

==> java api 8에 나온 설명과 여기있는 주석이 같다.

마우스를 올렸을 때 나오는 툴팁박스가 여기서 나오는 것이다.

 

클래스 내에서, 사용될 변수들에 private라는 제어자를 타입앞에 써주면 변수의 값을 직접 변경하지 못하도록 하고 대신 메서드를 통해서 값을 변경할 수 있다.

아직 제어자에 대해 배우지 않았기 때문에 이런 방법이 있다는 참고만 해두자.

 

변수와 메서드

오늘 수업의 메인이다.

변수는 크게 세종류로 나뉜다. 나뉘는 기준은 변수가 선언된 위치이므로 종류를 파악하기 위해서는 변수가 어느영역에 선언되었는지를 확인해야한다.

메서드영역에 선언된 변수를 지역변수, 클래스영역에 선언된 변수를 멤버변수라 하고 멤버변수중 static이 붙은 것을 클래스변수, 붙지 않은 것을 인스턴스변수라 한다.

클래스변수는 모든 인스턴스가 공통된 저장공간을 공유한다. 즉, 모든 인스턴스가 같은 값을 가진다.

인스턴스변수는 인스턴스마다 독립된 저장공간을 가지므로 서로 다른값을 가질 수 있다.

위의 예제는 CardTest예제인데 같은 곳이 아닌 다른곳에 class를 만들어서 사용했다.

width와 height는 모든 인스턴스가 공통적으로 갖는 값이므로 클래스변수이다.

그렇기 때문에 class를 생성할 당시 static을 붙여주었다.

이를 사용할 때는 클래스이름으로 접근하는 것이 가독성면에서 훨씬 낫다는것도 알아두자.

 

메서드

메서드란 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.

메서드는 한번 정의해놓고 사용하기 때문에 높은 재사용성의 장점이 있다.

또한 중복된 코드를 제거함으로써 가독성을 비약적으로 높여준다.

여러 메서드들로 자주사용되는 코드들을 바꿔준다면, 프로그램의 구조가 매우 단순화시킬수 있다.

 

메서드에는 선언부와 호출부가 따로 존재한다.

호출부는 클래스에 저장된 메서드를 호출하는 부분을 말하며 보통 메인메서드에서 진행된다.

선언부는 다시 선언부와 구현부로 나뉜다.

기본적인 구조를 보면,

반환타입.메서드이름(매개변수) {

     구현부

}

이런식으로 이루어져 있는데 여기서 반환타입, 메서드이름, 매개변수 등을 적은 부분을 선언부라 한다.

메서드의 이름은 동사인 경우가 많으며 이름만으로도 메서드의 기능을 쉽게 알수 있도록 의미있는 이름을 지어줘야 편하다.

선언시에 반환타입도 무조건 적어주어야 한다.

매개변수는 입력값을 말하는데, 이 또한 각각 타입을 명시해주어야 한다.

여기서 매개변수 또한 메서드 내에 선언된 것으로 간주되므로 지역변수에 속한다.

만약 반환값을 필요로 하지 않는 메서드일 경우 반환타입에 void를 적어야 한다.

메서드 타입이 void가 아닐 경우 return이 반드시 포함되어야 하는데, 사실 void의 경우에도 return이 생략된 것일 뿐 return을 쓴다고 해서 에러가 발생하지는 않는다.

여기서도 주의할 점이 있는데, return값이 조건에 의한 것이라면 조건을 만족하지 않을 경우도 살펴보아야 한다.

 

메서드의 호출

메서드를 호출할 때 괄호 안에 지정해준 값들을 인자라고 하는데 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.

인자는 메서드가 호출되면서 매개변수에 대입되므로 인자의 타입은 매개변수의 타입과 일치하거나 자동형변환이 가능한 것이어야 한다.

지금까지 우리가 제일 많이 사용한 main 메서드의 경우는 좀 특별한데, 이는 프로그램 실행과 동시에 자동으로 운영체제에 의해, JVM에 의해 호출된다.

 

검증하는 것을 validation이라 하는데 메서드를 만들 때에는 반드시 검증을 해주어야 한다. 여러가지 트라이를 통해 에러가 날 만한 상황을 다 막아주어야 탈없이 사용할 수 있다.

 

JVM의 메모리구조

JVM은 크게 3가지 주요영역으로 나뉘어있다.

1. 메서드영역

 - 프로그램 실행 중 어떤 클래스가 사용되면 해당 클래스의 클래스파일을 읽고 분석하여 정보를 이곳에 저장한다. 또한 그 클래스의 클래스 변수도 이 영역에 함께 생성된다.

2. 힙(heap)

 - 인스턴스가 생성되는 공간. 프로그램이 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉 인스턴스 변수들이 생성되는 공간이다.

3. 호출스택(call stack)

 - 호출스택은 메서드의 작업에 필요한 메모리공간을 제공한다. 여기에는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용되고 작업을 마치면 할당되었던 메모리공간은 JVM에 의해 반환되어 비워진다.

 

위의 예제에서 결과값이 왜 저런 순서로 나오는지를 이해해야한다.

이는 후입선출이라고도 하는 stack의 개념을 알고나서 확인해봐야 한다.

직접 하나씩 써가며 확실히 이해해 두는 편이 좋다.

 

 

 

오늘은 여기까지!!

오늘 과제가 기능까지 구현해내면 드디어 프로그램다운 프로그램이 된다.

혼자서 이것저것 해봤지만 기능까지 구현해낼수 있을지는 모르겠다..

하다보니 얼마나 걸릴지 상상도 가지 않아 일단 복습부터 하고 블로그작성후 다시 과제로 간다.

슬슬 프로그램다운 것들을 코딩할 때 어찌해야할지 대충이라도 그림이 그려지다보니 재밌다...

728x90