목표
자바의 Class에 대해 학습하세요.
학습할 것 (필수)
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
마감일시
2020년 12월 19일 토요일 오후 1시까지.
메소드 정의하는 방법
가장 유명한 메소드는 다음과 같다.
public static void main(String[] args) {
}
이름은 main 이고 메소드가 실행되면 중괄호 안에 있는 내용이 순차적으로 실행된다.
public static void main(String[] args) {
String myName = "doyoung";
System.out.println(myName);
}
// 실행결과
// doyoung
메소드는 왜 이렇게 생긴 것일까?
- main 이라는 글자 오른쪽에는 소괄호는 무엇이고 String[] arg는 무엇일까?
- public, static 그리고 void 는 무엇이고 의미하는 바는 무엇일까?
- 이름은 main 인데 어떤 식으로 작성해야 하는 것 일까?
1. main 이라는 글자 오른쪽에는 소괄호는 무엇이고 String[] arg는 무엇일까?
main 메소드와 비슷한 메소드를 하나 만들어 보았다.
public static void helloByName(String name) {
System.out.println("Hello my name is " + name);
}
public static void main(String[] args) {
String doyoungName= "doyoung";
String illyName= "illy";
helloByName(doyoungName);
helloByName(illyName);
}
// 실행결과
// Hello my name is doyoung
// Hello my name is illy
여기서
helloByName(doyoungName);
는 메소드 helloByName 을 호출 하는 호출 문이다.
호출을 하게 되면 helloByName 중괄호 부분이 실행되어 콘솔에 찍히게 되는 것이다.
결과가 각각 doyoung 과 illy 가 찍혔는데, 이 문자들은 호출 하기 전에 선언하였고 호출 할 때, 변수를 소괄호 안에 넣어서 호출 했다.
즉, 호출 할 때, 메소드 구현부에서 실행되는 String name 변수들이 매개변수(parameter) 라고 불린다.
외부로 부터 어떤 변수를 전달 받을 것인지 어떤 타입일 것인지 를 의미한다.
여기서는 외부로 부터 String 타입의 name 이라는 변수에 값을 전달 받아 콘솔에 찍는 기능을 하는 메소드를 만든 것이다.
메소드의 이름과 매개변수를 통해서 호출 하게 되는 데, 메소드 이름 과 매개변수를 메소드 시그니처 라고 표현하기도 한다.
2. public, static 그리고 void 는 무엇이고 의미하는 바는 무엇일까?
public
은 접근 제어자 중의 하나이다.
접근 제어자는 변수, 메소드, 클래스에 대한 접근, 호출을 제어 하는 것이다.
public |
접근을 제한하지 않음 |
protected |
동일한 패키지 내에 존재하거나 파생클래스에서만 접근 가능 |
default |
아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근이 가능 |
private |
자기 자신의 클래스 내에서만 접근이 가능 |
static
은 메모리 영역의 위치를 정한다.
static 이라고 명시하면 메모리 영역의 위치가 static 이고 명시하지 않으면 heep 이 된다.
|
static |
heep |
Garbage Collector 관리 |
X |
O |
생성 시기 |
프로그램 실행 |
인스턴스화 |
죽음 시기 |
프로그램 종료 |
오랜 시간 참조 X |
static 일 경우, 프로그램 실행 부터 종료까지 언제든 사용 할 수 있는 메모리 영역에 위치한다.
하지만 heep 일 경우, 인스턴스화가 되어야지만 사용할 수 있는 메모리 영역에 위치한다.
지금 사용하는 예시가 모두 static 인 이유는 아직 인스턴스화를 배우지 않아서 이다. 아래의 클래스 부분에서 다뤄볼 예정이다.
void
void 를 해석하면 공허함 이라는 뜻이 나온다. 왜냐하면 void 자리는 메소드가 주는 값의 종류를 의미한다.
void 일 경우는 아무런 값을 주지(return) 않는다. 를 의미한다.
예를 들어서 다음 과 같이 내 이름이 들어간 이메일을 만드는 기능을 하는 메소드를 만들었다.
public static String generateNaverMailByName(String name) {
return name + "@naver.com";
}
이번엔 void 대신 String 이니 대입연산자를 이용해서 String 변수에 할당 할 수 있는 것이다.
String doyoungNaverEmail = generateNaverMailByName(doyoungName);
// doyoung@naver.com
3. 이름은 main 인데 어떤 식으로 작성해야 하는 것 일까?
- 첫번째 문자는 소문자 영어여야 한다.
- 카멜 케이스를 사용해야한다. (getName)
클래스 정의하는 방법
클래스는 데이터와 기능(메소드) 두 가지로 이루어져 있다.
- 데이터(data): 프로그램 상에서 유지하고 관리해야 할 데이터
- 기능(method): 데이터를 처리하고 조작하는 기능
은행계좌 관련된 데이터와 기능을 모아 클래스를 하나 만들어 보았다.
이는 잔액 이라는 데이터를 가지고있고, 입금, 출금, 잔액확인을 할 수 있는 기능이 있다.
public class BankAccount {
private int balance = 0;
public int deposit(int amount) {
balance += amount;
return balance;
}
public int withdraw(int amount) {
balance -= amount;
return balance;
}
public int checkMyBalance() {
System.out.println("잔액 : " + balance);
return balance;
}
}
해당 클래스를 바로 사용할 수 있지는 않다.
사용하려면 메모리가 할당 되어야 하는데, 할당 시키기 위해서는 static 이나 인스턴스화를 해야한다.
위에서 static 에 대한 설명은 했으니 인스턴스화를 설명해 보자면,
설계도를 실체로 만드는 것을 의미한다.
과정은 다음과 같다.
BankAccount bankAccount = new BankAccount();
new 라는 키워드와 생성자를 호출 하면 된다.
기본적으로 생략이 되어있지만 생성자는 하나씩 가지고 있다.
여기서 생략된 생성자는 다음과 같다.
public BankAccount() {
}
이 생성자를 통해서 실체가 되는 것인데 실체가 되는 과정속에서 데이터의 값을 할당 할 수 있고 그것을 초기화 라고 부른다.
예를 들어서 계좌의 이름을 할당하면서 실체로 만들 때는 다음과 같은 생성자를 만들 수 있다.
먼저 name 이라는 데이터를 추가하고
private String name;
public BankAccount(String name) {
this.name = name;
}
매개변수로 부터 계좌이름을 받아와서 실체화 하는 것이다.
이 때 매개변수의 이름과 클래스 내의 데이터 와 이름이 같기 때문에, 구분을 하기 위해서
이 클래스의 name 이라는 의미로 this. 를 붙인다.
따라서 다음과 같이 인스턴스화 할 수 있다.
다른 말로는 객체를 생성한다고도 한다.
BankAccount bankAccount = new BankAccount("doyoung");
'스터디 > [white-ship] 자바 스터디(study hale)' 카테고리의 다른 글
4주차 과제: Stack (0) | 2021.01.02 |
---|---|
4주차 과제: Queue (0) | 2021.01.02 |
5주차 과제: BinaryTree 이론 (0) | 2021.01.01 |
7주차 과제: 패키지 (0) | 2021.01.01 |
5주차 과제: BinaryTree 실습 (0) | 2021.01.01 |
댓글