Class를 구성하는 것
1. 필드(변수)
2. 생성자
3. 메소드=method=함수=function (java에서는 같은 말로 통영된다.)
# 클래스 생성하는 방법
Class 클래스 이름{
}
메모리 공유에 대해
클래스의 메소드 사용
# 함수의 유형 (총 4가지)
void : '없다' 라는 의미로 return을 해줄게 없다는 타입으로 사용
return 존재 인수 전달 X X X O O X O O
# return 에 대해
- 하나밖에 return이 되지 않는다.
- 변환 타입으로 객체를 생성할 경우, 실행 과정에서 return을 만나지 못하는 경우가 발생할 수 있다.
- return을 강제 종료, 실행 종료에 사용이 가능하다. (함수 자체가 더 이상 진행할 의미가 없을때 사용)
# 생성자
1) 생성자는 함수이다. --> 그래서 생성자 함수라고 한다.
2) 함수 이름은 클래스 이름과 반드시 동일해야 한다.
3) 생성자 함수는 리턴값을 가질 수 없다. 그래서 void 조차도 생략한다.
4) 생성자 함수도 오버로딩이 가능하다.
5) 생성자 함수는 객체가 생성될때, 단 한번 호출된다. (임의로 호출할 수 없다.)
6) 생성자를 사용하는 목적은 멤버 메소드를 초기화하는 목적으로 사용된다.
7) 생성자 함수를 작성하지 않을 시에는 자동으로 default 생성자가 만들어진다.
자바도 소멸자가 있나요?
: 물론 있다! 하지만 쓰지 않는다. 즉, 자바 소멸자 문법은 존재하지마, 사용하지 않는다.
자바에서는 객체를 사용하고 필요가 없을때, 알아서 자체적으로 소멸자를 호출하기 때문이다.
만약, 내가 자바에서 객체를 사라져라고 요청했다고 가정했을때, 즉석해서 없앨 수 없으며 자바에서 소멸을 예약시켜 언제 소멸될지 모르는 상태가 된다.
결론적으로, 자바는 메모리를 달라고 하고 해제해야하는 다른 언어와 달리, 해제할 필요가 없으며 자동적으로 메모리 해제를 처리해준다.
생성자는 멤버, 메소드를 초기화하는 목적으로 사용되는데, 처음부터 멤버를 선언할때 초기화해주면 되지 않나요?
: 맞다. 그렇긴 한데 생성자 오버로딩에서 차이가 난다!
같은 생성자 이름으로 인수 전달을 달리 했을때, 사용의 용도가 달라지기 때문이다.
생성자 사용 목적은 멤버와 메소드를 초기화하기 위함
자바에서는 클래스 생성 시, 자동으로 디폴트 생성자를 만들어준다.
하지만, 사용자가 생성자를 생성했다면 더이상 디폴트 생성자를 만들어주지 않는다!!
고로, 프로그래머는 프로그램할때 쓰든 안쓰든 디폴트 생성자를 그냥 쓴다.
static
클래스 안에서 static을 선언했을 때, 컴파일과 동시에 static으로 선언된 필드나 메소드는 객체의 공용 필드, 공용 메소드가 된다. 다른 말로 전역 필드, 전역 함수가 되는 것이다.
그래서 객체 생성과 상관없이 static을 사용할 수 있다.
여기서 원칙은 static으로 선언된 필드나 메소드는 클래스를 통해 접근이 가능하다. 하지만 객체로 접근하는 것이 불가능한건 아니다. (원칙이 아닐 뿐)
프로그램에서 비용이 많이 든다고 말하는 것은
1. 실행 속도가 오래 걸린다.
2. 메모리를 많이 쓴다.
프로그램에서 비용이 많이 드는 경우는
- 파일 입출력 : 외부 하드웨어에 요청해서 사용하기 때문에 비용이 많이 듦 (하드웨어 스펙으로 해결에 따른거라 프로그램에서 해결할 수 있는 사항은 아님)
- 함수 호출
- 함수 인자 전달 : 인자 전달을 많이 하면 할수록 비용이 많이 듦
- 객체 생성 : new Tiger() 와 같이 객체를 생성할때 비용이 많이 든다.
여기서 static 함수는 객체 생성을 안시키겠다는 의미 → 비용을 절감하겠다는 말
참고로, 실행 시간이 많이 걸리는 함수는 수학 관련 함수가 자체적으로 오래 걸린다.
F3을 눌러 math의 함수들을 확인해보면 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 메소드만 사용할 수 있다.
클래스 특징과 static에 대한 내용의 예시들
final
# final을 사용하는 위치
1. 필드 앞 : 더이상 값을 변경할 수 없다는 의미
2. 메소드 앞 : 오버라이딩을 할 수 없다는 의미
3. 클래스 앞 : 상속을 할 수 없다는 의미
> final은 마지막이라는 뜻으로 사용되며, final의 변수는 대문자로 사용하는 것이 암묵적인 약속
값 변경 여부 | O | X |
변수 | 상수 |
this
this 사용 용도
1. 필드와 메소드 인자 전달 변수의 이름을 구분
2. Chaining
3. 다른 클래스에 내 객체를 넘기기 위해
4. 자기 클래스 안에서 다른 생성자를 호출하기 위해
public과 private
public : 누구사 사용할 수 있다.
private : class 내부에서만 사용할 수 있다. (데이터 은닉 - 외부에서는 사용하지 못한다.)
입력
파일 입출력
항상 파일 입출력 시, 파일을 열고 난 뒤에 닫아주어야 함에 주의하자.
제너릭 문법
이것은 코드의 양이 줄어든 것이 아니다. 왜냐하면 컴파일에서 제너릭 문법을 적용하기 전의 상태에서 실행이 되기 때문에, 이것은 코드 작성 줄이 줄어들었다고만 봐야한다.
따라서 제너릭 문법은 편집으로서의 의미를 갖는다.
'웹 full stack 교육 > 이론' 카테고리의 다른 글
[Java] 자바 기타 (0) | 2021.08.30 |
---|---|
[Java] 자바 상속 (0) | 2021.08.27 |
[Java] 자바 문법[조건문, 반복문] (0) | 2021.08.26 |
[Java] 자바 문법[기초] (0) | 2021.08.25 |
[Java] 이클립스 사용하기[기초 - 기호 및 용어 정리, 단축키 사용] (0) | 2021.08.25 |