○메서드의 실행(호출)
메서드는 보통 하나의 기능 단위로 선언하고, 그 기능이 필요할때 실행하게된다. 문서나 대화 중 메서드를 실행 또는 호출한다는 표현을 혼용해서 사용한다. 호출이라는 표현이 맞다. 더 정확하다고 보면 된다.
메서드도 변수와 마찬가지로 클래스메서드와 인스턴스 메서드가 있다.
예제를 보겠다.
package Chapter07;
public class Methodcall {
public static void main(String[] args) {
// 직접 실행
Method.printName();
// 객체를 생성해서 실행
Method m = new Method();
m.printEmail();
}
}
class Method {
static void printName() {
System.out.println("printName() 실행");
}
void printEmail() {
System.out.println("printEmail() 실행");
printId(); // 다른 메서드 실행
}
void printId() {
System.out.println("printId() 실행");
}
}
[실행결과]
printName() 실행
printEmail() 실행
printId() 실행
Method라는 클래스에서 메소드를 여러가지 만들어주고. MethodCall 클래스에서 메서드를 호출하는것을 보여준다
메소드 클래스에서 보면 printName 메소드는 static 키워드를 붙여준 것을 볼 수 있는데 static 키워드를 붙여주면 객체 생성이 따로 없이 클래스명으로 직접 사용함을 볼 수 있고. 다른것들은 객체를 생성해서 실행해야 함을 알 수 있다.
○ 메서드의 실행순서
자료구조 중에 스택(stack)이라는 자료구조가 있다. 이 스택은 가장 나중에 들어온 데이터가 가장 먼저 출력되는 자료구조이다. Last In First Out이라고 한다.
스택 말고 Firs In Last Out도 있는데 이것은 나중에 배우겠다.
Stack을 간단히 설명하면 스택이 쌓인다 라고 보면된다 예를들어 입력값이 순서대로 1,2,3 이 들어갔는데 뺄때는
3, 2,1 순으로 나오는 것을 볼 수 있다.
이와 같이 빈공간에 넣을때 밑에부터 쌓이고 나올때는 위에서 부터 나온다는 뜻이다.
예제를 보겠다.
package Chapter07;
public class MethodOrder {
public static void main(String[] args) {
MethodEx me = new MethodEx();
me.one();
}
}
class MethodEx {
void one() { // 1
two();
System.out.println("one");
}
void two() { // 2
three();
System.out.println("two");
}
void three() { //3
System.out.println("three");
}
}
[실행 결과]
three
two
one
이 예제는 one()메서드를 실행하고 one()이 two()를 two()는 three()를 실행하는것을 볼 수있다.
실행 순서는 one() -> two() -> three() 인데, 출력결과를 보면 three -> two -> one 순으로 출력이된다.
○ 메서드 오버로딩
클래스 내 이름이 같은 메서드가 여러개 있을 수 있다. 이것을 오버로딩이라고한다.
오버로드의 사전적의미는 과하게 많이 적재한다는 의미이다. 왜 메서드 오버로딩이 필요한가?
매개변수를 다양하게 입력받기 위함이다.
이 예제를 살펴보자
package Chapter07;
public class Overloading2 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(5.5);
System.out.println((long)100);
System.out.println("홍길동");
System.out.println('a');
System.out.println(new Overloading2());
System.out.println(new int[5]);
System.out.println(new char[] {65, 97, 'c', '가', '\uac00'});
}
}
[실행 결과]
1
5.5
100
홍길동
a
Chapter07.Overloading2@2f92e0f4
[I@28a418fc
Aac가가
sysout을 이용해, int, double, long, String, char, ... 다양한 자료형을 이용하여 출력을 해보았다.
본인은 다양한 매겨변수의 자료형에대한 메서드를 만들지 않았는데 다 출력이 된다. 그 이유를 살펴보면 이와 같다.
println을 컨트롤키를 누른상태에서 println()메서드를 클릭해보면 PrintStream class 클래스의 해당 println()메서드로 이동된다. 여기서 소스를 살펴보면 println에 대해서 오버로딩된 메서드들이 정말 많다. 자바에서 이미 해준것이다.
이를 통해 알 수 있다.
○ 생성자
생성자(Constructor)는 new 연산자와 함께 객체를 생성할 때 사용된다.
생성자는 메서드와 비슷하게 생겼지만, 클래스 이름과 생성자 이름이 동일해야 하고, 리턴값이 없다.
생성자는 객체가 생성될때 가장 먼저 실행되므로 객체 내의 필드(변수)를 초기화하거나, 객체를 사용하기 전에 준비하는 실행문을 생성자 블록 안에 넣는 경우가 많다.
생성자의 구조
클래스명 (매개변수...){
초기화 실행문
...
}
구조는 이렇게 생겼다. 생성자명이 곧 클래스명이다. 생성자도 매개변수가 있을 수도 있고 없을 수 도 있다. 중괄호로 블록이 구분되며, 리턴값은 없다.
○ 기본생성자
선언한 생성자가 없을때 compile (저장)시점에 기본생성자가 생긴다.
모든 클래스는 생성자가 반드시 하나 이상 존재한다. 생성자는 파라미터가 없다.
예를들어 Member 라는 java 파일을 만들고, 생성자를 만들지 않았지만 저장하는 순간 컴파일되어 class 파일의 바이트코드로 변환되면서 Member()라는 기본 생성자가 자동으로 추가된다.
Member member = new Member();
new 연산자 뒤의 Member()가 바로 기본 생성자이다.
○ 변수 초기화
기본 생성자가 아닌 직접 생성자를 정의할 수 있는데 생성자는 메서드와 비슷하게 생겼으나 return값이 없고
생성자명이 클래스명과 동일하다. 생성자의 용도는 객체를 생성할 때 초기화하는 목적이다
○ this
this 생성자 "미래에 생성될 객체의 주소 값".을 말한다. 언제나 인스턴스 안에서만 사용가능하고 나의 객체의 다른 이름이다.
생성자간에도 서로 실행이 가능하고, 생성자명 대신 this라는 키워드를 사용한다. 주의 할 점은 다른 생성자를 실행 할 때는 반드시 첫줄에서 실행해야 한다.
this는 편하게 객체 자신 이라고 생각하면 된다.
○ 초기화 블록
초기화 블록은 static 초기화 블록과 인스턴스 초기화 블록이 있는데, static 초기화 블록은 클래스가 메모리에 로드될 때 한번만 실행된다. 인스턴스 초기화 블록은 객체가 생성될 때마다 실행 되는 블록이다.
블록은 열고 닫으면 끝이다.
'JAVA > 개념' 카테고리의 다른 글
19일 (0) | 2023.01.19 |
---|---|
JAVA 패키지, import, 접근제한자, 상속 (2) | 2023.01.18 |
8일차, JAVA 메서드,접근제한자, 리턴타입, 메서드명 작성규칙,매개변수 (0) | 2023.01.16 |
5일차, JAVA 향상된 for문, 객체지향 프로그래밍, 필드 (0) | 2023.01.13 |
3일차, JAVA 삼항연산, 문자열 연산, 연산자 우선순위, 제어문 (0) | 2023.01.11 |