접근제한자 리턴타입 메소드명(인수1, 인수2, ...){
수행코드;
return 반환값;
}
리턴값 없을시 리턴타입은 void
메서드의 결과값은 하나의 형태로 만들어짐
변수는 데이터를 하나의 형태로 저장.
메서드의 이름이 변수의 역할을 함.
call by value(값 전달)
call by reference(번지 전달)
자바는 객체지향 언어이기에 번지 전달 방식을 더 많이 사용
배열 전달 등
그냥 똑같이 작성하면 된다.
하나의 클래스 내에서 동일한 이름의 메서드를 여러 개 사용할 수 있는 객체지향 기법.
메서드의 시그니처가 달라야 사용 가능(매개변수의 개수, 매개변수의 타입)
--> C언어에서는 함수명이 고유하게 존재하기때문에 불가능하지만 자바에서는 같은 이름의 메소드라도 매개변수 개수나 타입이 다르면 같은 이름의 다른 메소드를 정의해서 사용 가능하다.
그럼 호출할 때 어떻게 구분해서 호출하는 걸까?
public class OverloadingTest {
public static void main(String[] args) {
int sum1 = add(3, 5);
System.out.println("sum1 = " + sum1);
float sum2 = add(3.5f, 3.5f);
System.out.println("sum2 = " + sum2);
}
public static int add(int a, int b){
int sum = a + b;
return sum;
}
public static float add(float a, float b){
float sum = a + b;
return sum;
}
}
// result
// sum1 = 8
// sum2 = 7.0
그냥 알아서 찾아서 한다. 똑똑자바
다만 타입과 매개변수 개수를 모두 비교해서 일치하는 경우를 찾아야 하는 과정이 있기 떄문에 연산 속도는 당연히 느려질 수 밖에 없지 않나?
그렇다면 왜?
수많은 메서드가 있을 때 메서드 이름을 하나하나 찾아 사용할 것 없이 같은 기능은 같은 이름으로 사용해서 편의성을 도모한다~
정적 바인딩
: 컴파일 시점에서 사용될(호출될) 메서드가 결정(연결)되는 바인딩.
같은 이름의 메서드라도 컴파일 후엔 컴파일러가 알아서 구분해서 바꿔버림.
정적 바인딩에서 호출될 메서드가 연결되기 때문에 실행속도와는 상관없게 된다.
메서드는 클래스 내에서 독립적으로 만들어야 한다(하나의 단위작업을 처리).
main class
미리 작성하여 제공하는 메서드
String(API)
미리 작성하여 제공하는 메서드
length(), charAt(int index), toUpperCase()
MyClass
사용자 정의 메서드
method: 객체가 가지고 있는 동작
overload: 하나의 클래스 내에서 동일한 이름의 메서드를 여러 개 사용할 수 있는 객체지향 기법
메서드의 시그니처: 매개변수 개수, 타입
정적 바인딩: 컴파일 시점에서 사용될 메서드가 결정됨
메서드의 매개변수 전달 기법 중 자주 사용하는 2가지: call by value, call by reference
메서드의 결과값은 몇 개의 형태로 만들어지는가?: 한 가지
메서드의 수행결과를 반환하는 명령어: return
model
Object(객체) = Model(모델) = Value Object = Data Transter Object
DTO: 계층 간 데이터의 전송을 위해 도메인 모델 대신 사용되는 객체. 프로세스 사이에서 데이터를 전송하는 객체.
class
객체를 설계, 모델링하는 도구.
객체지향 측면: 현실세계에 있는 객체를 객체지향 프로그램에서 사용하기 위해 객체의 상태정보(멤버변수)와 행위정보(멤버메서드)를 뽑아서 설계하는 도구.
package: 기능이 서로 비슷한 클래스끼리 묶어 분류.
생성자 메서드(Constructor)
new 연산에 의해 호출이 됨. 자신이 가지고 있는 멤버들을 메모리에 올려 객체를 생성하는 역할.
메서드이름==클래스이름
접근 제한자가 public일 경우에만 호출됨.
모든 클래스는 기본 생성자(default constructor)를 가지고 있음(public 메서드명). 작성하지 않아도 o, 생략되어있음.
객체의 초기화를 위해 사용됨.
return이 없기 떄문에 void x
this
자신을 가리키는 객체변수, 참조변수, 포인터변수.
객체 생성시 생성됨.
자기자신의 메모리 주소
객체 생성 후 멤버에 접근하는 방법: 도트 연산자로 접근
this.변수
heap memory: 객체가 만들어진 메모리 공간
heap area: 객체가 만들어진 메모리 영역
class:
자료형 측면-새로운 자료형을 만드는 도구
객체지향 측면-현실세계에 있는 객체를 객체지향 프로그램에서 사용하기 위해 객체의 상태정보(멤버변수)와 행위정보(멤버메서드)를 뽑아서 설계하는 도구.
객체생성: 객체를 메모리에 올리는 과정
객체를 구성하는 2가지 정보: 상태정보, 행위정보
객체 생성 역할의 메서드: 생성자 메서드
객체 생성 후 자기 자신을 가리키는 레퍼런스 변수: this
heap에서 만들어진 객체를 부르는 말: 인스턴스
Object(현실적) = Class(프로그래밍적) = Model(소프트웨어 공학적)
역할에 따라 다양한 모델을 만들어 사용할 수 있다.
Model의 종류
- 시작 클래스(모델)
- DTO(Data Transfer Object), VO(Value Obejct) Model: 데이터를 담는(이동) 모델
- DAO(Data Access Object) Model: 데이터를 처리(DB)하는 모델(DRUD 기능을 하는)
- Utility Model: 도움(Utility)을 주는 모델(Helper Object)
DTO, VO calss가 필요한 이유
데이터를 하나로 묶는 경우.
하나의 객체에 대한 여러 값을 입력 받아 다른 메서드로 이동시켜야 하는 경우.
DB에 있는 데이터를 프로그램에서 가져와서 사용해야 하는 경우.
ex) 매개변수로서 값을 넣을 때 하나의 class를 정의한 후 한번에 넘겨주는 방법을 이용할 수 있다(call by reference)
import java.util.Scanner;
public class bufferTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("enter input1");
int input1 = sc.nextInt();
System.out.println("input1 = " + input1);
System.out.println("enter input2");
int input2 = sc.nextInt();
System.out.println("input2 = " + input2);
sc.nextLine();
/* 입력값을 buffer 형식으로 가져옴. queue에 담긴 값 중 정수까지만 가져가기 때문에
queue에는 \n이 남아있음. 그래서 다음 입력시 buffer를 비워주지 않으면
\n값이 다음 입력에 들어가는 것. */
System.out.println("enter input3");
String input3 = sc.nextLine();
System.out.println("input3 = " + input3);
// buffer를 비워주지 않아도 다음 str 입력값에는 영향이 없다. 앞에서 str 타입은 모두 입력받기 때문인 듯
System.out.println("enter input4");
String input4 = sc.nextLine();
System.out.println("input4 = " + input4);
// string 이후 int 입력에도 문제가 없다.
System.out.println("enter input5");
int input5 = sc.nextInt();
System.out.println("input5 = " + input5);
}
}
DAO class가 필요한 이유
DB에서 데이터(VO, DTO)를 CRUD하기 위해 만들어지는 모델(클래스)
CRUD 동작을 가지고 있는 클래스. 비즈니스 로직을 처리하는 클래스.
다른 클래스랑 같은데 CRUD 동작은 여기에서 실행한다고 보면된다
Utility class가 필요한 이유
반복적으로 사용해야 될 동작(기능)을 별도의 클래스로 만들어 두고 필요할 때 사용하는 클래스. 필요할 때 만들어서 사용한다.
그냥 DAO, VO, DTO class를 제외한 다른 클래스.
객체지향 프로그래밍에서 클래스를 역할에 따라 부르는 이름
-> model
모델의 종류 3가지: DTO, DAO, Utility
DTO, VO: 객체 데이터를 하나로 수집해야 하는 경우 필요한 모델
DAO: DB에 데이터를 CRUD하기 위해 사용되는 모델
차(car)의 정보를 출력하는 CarUtil 이라는 class 내의 CarPrint 라는 method가 있음
이 method를 다른 클래스에서 호출할 때
import static CarUtil.CarPrint; 후
CarPrint();
CarUtil carUtil = new CarUtil();
carUtil.CarPrint();
나는 1번 방법을 생각하고 작성했는데, 2번 방법으로 진행하셨다. (static은 자동으로 import 됨)
둘다 실행 결과는 같았는데 그저 호출하는 방법에만 차이가 있을 뿐 같은 결과일까 궁금했다.
물어 본 결과,
보통 자바에서는 메서드 호출 시 new로 객체를 생성해서 사용한다. static 방식을 이용하면 공통적으로 사용하는 인스턴스를 만들어서 따로 보관해두고(static과 일반 메소드는 메모리에 적재되는 위치가 다르다) 호출해서 사용하는 것이다.
static- 정적으로 하나만 생성해서 공용으로 사용할 수 있게 함(주로 자주 사용되나 변하지 않는 메서드)