728x90

Class를 구성하는 것

   1. 필드(변수)

   2. 생성자

   3. 메소드=method=함수=function (java에서는 같은 말로 통영된다.)


# 클래스 생성하는 방법

Class 클래스 이름{
}
메모리 공유에 대해

생성한 사용자 클래스를 이용하여 만들어진 각각의 객체는 전부 서로 다른 고유번호를 갖는다는 것을 hashCode() 를 통해 알 수 있다.

 

클래스의 메소드 사용

merry라는 강아지를 부르면, 멍! 하는 짓는 프로그램. (함수를 사용할 때, "함수를 부른다" 라는 말로 '함수를 콜한다'고 말함)


# 함수의 유형 (총 4가지)
return 존재 인수 전달
X X
X O
O X
O O
void : '없다' 라는 의미로 return을 해줄게 없다는 타입으로 사용

return 존재 여부와 인수 전달 여부에 따른 다양한 종류의 함수 유형


함수 유형 4가지에 파생된 예시
이 부분 중요!!


# return 에 대해
- 하나밖에 return이 되지 않는다.
- 변환 타입으로 객체를 생성할 경우, 실행 과정에서 return을 만나지 못하는 경우가 발생할 수 있다.
- return을 강제 종료, 실행 종료에 사용이 가능하다. (함수 자체가 더 이상 진행할 의미가 없을때 사용)

return에 대한 예시


# 생성자
1) 생성자는 함수이다. --> 그래서 생성자 함수라고 한다.
2) 함수 이름은 클래스 이름과 반드시 동일해야 한다.
3) 생성자 함수는 리턴값을 가질 수 없다. 그래서 void 조차도 생략한다.
4) 생성자 함수도 오버로딩이 가능하다.
5) 생성자 함수는 객체가 생성될때, 단 한번 호출된다. (임의로 호출할 수 없다.)
6) 생성자를 사용하는 목적은 멤버 메소드를 초기화하는 목적으로 사용된다.
7) 생성자 함수를 작성하지 않을 시에는 자동으로 default 생성자가 만들어진다.

다음과 같이 new를 쓸때 뒤에 쓰는 클래스 이름이 생성자를 호출한다. 이는 반드시 new 뒤에만 호출이 되고, 내가 임의로 선언할 수 없다.

자바도 소멸자가 있나요?

: 물론 있다! 하지만 쓰지 않는다. 즉, 자바 소멸자 문법은 존재하지마, 사용하지 않는다.
자바에서는 객체를 사용하고 필요가 없을때, 알아서 자체적으로 소멸자를 호출하기 때문이다.

만약, 내가 자바에서 객체를 사라져라고 요청했다고 가정했을때, 즉석해서 없앨 수 없으며 자바에서 소멸을 예약시켜 언제 소멸될지 모르는 상태가 된다.

결론적으로, 자바는 메모리를 달라고 하고 해제해야하는 다른 언어와 달리, 해제할 필요가 없으며 자동적으로 메모리 해제를 처리해준다.

생성자는 멤버, 메소드를 초기화하는 목적으로 사용되는데, 처음부터 멤버를 선언할때 초기화해주면 되지 않나요?

: 맞다. 그렇긴 한데 생성자 오버로딩에서 차이가 난다!
같은 생성자 이름으로 인수 전달을 달리 했을때, 사용의 용도가 달라지기 때문이다.

생성자 오버로딩에 대한 예시

 

생성자 사용 목적은 멤버와 메소드를 초기화하기 위함

초기화 목적으로 사용된 생성자의 예시
처음부터 다음과 같이 멤버를 초기화하면 되지 않냐는 질문의 예시
다음과 같이 생성자 오버로딩에서 차이가 나는 결과를 보여주는 예시

 

자바에서는 클래스 생성 시, 자동으로 디폴트 생성자를 만들어준다.
하지만, 사용자가 생성자를 생성했다면 더이상 디폴트 생성자를 만들어주지 않는다!!

고로, 프로그래머는 프로그램할때 쓰든 안쓰든 디폴트 생성자를 그냥 쓴다.

사용자가 생성자를 만들었을때, 클래스가 디폴트 생성자를 자동으로 만들어주지 않아 오류가 생긴 모습을 보여주는 예시
직접 디폴트 생성자를 생성했을때, 오류가 해결되는 예시
기본적으로 프로그래머들이 프로그램할때, 작성해주는 디폴트 생성자는 그냥 한줄로 끝내버린다.

 

static

클래스 안에서 static을 선언했을 때, 컴파일과 동시에 static으로 선언된 필드나 메소드는 객체의 공용 필드, 공용 메소드가 된다. 다른 말로 전역 필드, 전역 함수가 되는 것이다. 

 

그래서 객체 생성과 상관없이 static을 사용할 수 있다.

 

여기서 원칙은 static으로 선언된 필드나 메소드는 클래스를 통해 접근이 가능하다. 하지만 객체로 접근하는 것이 불가능한건 아니다. (원칙이 아닐 뿐)

staic 필드를 클래스 내부에서 다음과 같이 선언
컴파일 되었을때 임의적인 모습을 나타낸 예시


static 메소드를 클래스 내부에서 다음과 같이 선언
컴파일 되어을때, 임의적인 모습을 나타낸 예시

프로그램에서 비용이 많이 든다고 말하는 것은
   1. 실행 속도가 오래 걸린다.
   2. 메모리를 많이 쓴다.

프로그램에서 비용이 많이 드는 경우
  - 파일 입출력 : 외부 하드웨어에 요청해서 사용하기 때문에 비용이 많이 듦 (하드웨어 스펙으로 해결에 따른거라 프로그램에서 해결할 수 있는 사항은 아님)
  - 함수 호출 
  - 함수 인자 전달 : 인자 전달을 많이 하면 할수록 비용이 많이 듦
  - 객체 생성 : new Tiger() 와 같이 객체를 생성할때 비용이 많이 든다.

여기서 static 함수는 객체 생성을 안시키겠다는 의미 → 비용을 절감하겠다는 말

참고로, 실행 시간이 많이 걸리는 함수는 수학 관련 함수가 자체적으로 오래 걸린다. 
F3을 눌러 math의 함수들을 확인해보면 static으로 사용된 것을 확인할 수 있다. --> 최대한 비용을 절감하려고

Math 표준 클래스에서 제공하는 abs 메소드를 사용할 때, 해당 abs 함수의 오픈 소스를 확인하면 static이 적혀있는 것을 확인할 수 있다.

 표준 클래스 중에서 Math의 메소드는 static을 붙이는데, String의 메소드에는 static을 안붙이나요?

: static을 사용하는 차원에서고려해야하는 상황이 있다.
static을 사용하게 되면, 실행 속도는 빨라지지만 메모리를 많이 차지하게 된다.
그러므로 모든 표준 클래스에 static을 붙이는 것은 불가능하다는 것을 기억하면 된다.

void main 을 entry point 라고 하며, 여기서 main은 함수 이름이다.

지금까지 우리가 사용한 프로젝트도 Hello라는 클래스를 사용하고 있다.

 

또, 현재 사용하고 있는 main은 메소드이며, static을 사용하고 있다.

 

이 main을 누가 불렀느냐?

 

운영체제가 main을 불러서 main이 실행이 된다.

static을 지우면, 운영체제는 main을 부르지 못한다. 해결 방법은 운영체제는 직접 이 객체를 생성해서 사용해야한다.

 

정확하게 [이것이 자바다]책에 있는 내용을 읊으면, java.exe로 JVM을 구동시키면 제일 먼저 main() 메소드를 찾아서 실행시킨다고 한다. 그래서 main() 메소드를 프로그램 실행 진입점(entry point)라고 한다. 

 

아래에는 지금까지 사용한 프로젝트 클래스를 다루어 보았다.

이렇게 프로젝트 클래스를 일반 클래스와 동일하게 사용할 수 있으며, 전혀 문제가 되지 않는다.


static 주의 사항
1. static 메소드는 static 멤버만 사용할 수 있다.
2. static 메소드는 static 메소드만 사용할 수 있다.

클래스에 선언된 멤버를 main 메소드에서 사용할 수 없다. 왜냐하면, main은 static으로 선언이 되어있기 때문이다. 즉, static으로 선언된 메소드는 static 멤버만 사용할 수 있다.
다음과 같이 static main 메소드에서 static 멤버를 사용한 예시이며, 적상작동하는 코드이다.


static 메소드에서 static이 아닌 메소드를 호출했을때, 오류가 생긴 예시
static 메소드는 static 메소드를 쓸 때, 정상작동하는 코드 예시


클래스 특징과 static에 대한 내용의 예시들

클래스 내에 메소드에서 객체 생성이 가능하다. 또한 생성한 객체 변수로 메소드 사용도 가능하다. 그리고 메소드 안에서 메소드를 사용할 수 있다.


그러나, static을 붙이게 되면 자기 클래스의 메소드를 사용할 수 없다. 사용하고 싶다면, static을 붙여야한다.
static을 붙여서 해결된 모습


 

final
# final을 사용하는 위치
  1. 필드 앞 : 더이상 값을 변경할 수 없다는 의미
  2. 메소드 앞 : 오버라이딩을 할 수 없다는 의미
  3. 클래스 앞 : 상속을 할 수 없다는 의미
> final은 마지막이라는 뜻으로 사용되며, final의 변수는 대문자로 사용하는 것이 암묵적인 약속
값 변경 여부 O X
  변수 상수

final 사용 예시

 

this

Tiger 타입의 this가 선언되어 있지만, 이는 자바에서 생략해놓음. 생략해 부분을 직접 작성할 시 오류가 남.
클래스 선언 시, 자바 내부적으로 다음과 같이 생성함을 이해

this 사용 용도
  1. 필드와 메소드 인자 전달 변수의 이름을 구분
  2. Chaining
  3. 다른 클래스에 내 객체를 넘기기 위해
  4. 자기 클래스 안에서 다른 생성자를 호출하기 위해

필드와 메소드 인자 전달 변수의 이름을 구분한다. --> 코드의 가독성 증가
Chaining 코드 예시, Chaining을 하는 이유는 코드 난입을 방지하기 위함이다.
서로 다른 클래스끼리 데이터를 이용하는 예시
자기 클래스 안에서 다른 생성자를 호출하는 예시

 

public과 private
public : 누구사 사용할 수 있다.
private : class 내부에서만 사용할 수 있다. (데이터 은닉 - 외부에서는 사용하지 못한다.)

get, set 함수가 있다는 것은 99% 변수가 private로 잡혀져 있다는 뜻으로 해석하면 된다.

 

 

입력

콘솔에서 입력받을 수 있는 예제 코드

 

파일 입출력

항상 파일 입출력 시, 파일을 열고 난 뒤에 닫아주어야 함에 주의하자.

파일 읽기 예제 코드 (데이터를 하나씩 읽는 것은 속도면에서 굉장히 좋지 못함)
파일 출력 예제 코드

 

제너릭 문법

제너릭 문법을 적용하기 전, 타입 별로 클래스를 선언함으로써 코딩의 번거로움을 확인할 수 있는 예제 코드
제너릭 문법을 통해 클래스가 타입에 따라 유동적으로 객체를 생성할 수 있는 예제 코드를 확인할 수 있다.

이것은 코드의 양이 줄어든 것이 아니다. 왜냐하면 컴파일에서 제너릭 문법을 적용하기 전의 상태에서 실행이 되기 때문에, 이것은 코드 작성 줄이 줄어들었다고만 봐야한다.

따라서 제너릭 문법은 편집으로서의 의미를 갖는다.

728x90

+ Recent posts