메소드란?
하나의 일정한 행동들을 정리해서 모아 놓은 것을 함수라고 한다.
자바에서는 모든 함수는 클래스안에서 정의 되기에 일반 함수는 존재 하지 않는다.
그렇기 때문에 자바에서 함수란 메소드를 말한다.
메소드의 기본 형태
public static 반환형 메소드명 (매개변수) {
실행문;
}
메소드의 호이스팅
클래스는 항상 컴파일 과정에서 정의되어 있는 녀석들을 먼저 정의 한 후에
메인함수를 실행 시키기 때문에 메소드가 메인함수의 위쪽이나 밑쪽이나 관계없이
어디에서든 쓸 수 있다.
메소드 예제 코드
// 매개변수: x, 반환: x
public static void method1() {
System.out.println("단순 실행");
System.out.println();
}
// 매개변수: int num 하나 , 반환: x // 지역변수
public static void method2(int num) {
System.out.println("num: " + num);
System.out.println();
}
// 매개변수: int num, int num2 두개, 반환 : x
public static void method3(int num, int num2) {
System.out.println("num: " + num);
System.out.println("num2: " + num2);
System.out.println();
}
// 매개변수: x , 반환형: String
public static String method4() {
return "데이터 반환";
}
public static String method5(int age) {
return age + "살";
}
public static void main(String[] args) {
method1(); // 메소드(함수) 호출
method2(1);
method3(100,200);
System.out.println(method4());
System.out.println();
String data1 = method4();
System.out.println(data1);
System.out.println();
System.out.println(method5(20));
System.out.println();
}
public static void ov1() {
System.out.println("매개변수 없음");
}
public static void ov1(int num) {
System.out.println("int 매개변수 하나");
}
public static void ov1(int num, String b) {
System.out.println("int 먼저 그다음 String");
}
public static void main(String[] args) {
ov1();
ov1(10);
ov1(10,"b");
}
위와 같이 메소드 오버로딩이 가능한 이유는, 각각의 메소드명에 들어가는
매개변수가 다르기 때문에 호출당시에 적용할 매개변수에 따라 구분이 가능해서
쓸 수가 있다.
객체지향언어 : 순차지향언어에 오브젝트 개념이 추가된 것이다.
객체 : 객체란 세상에 존재하는 모든 것을 의미한다.
프로그래밍 관점에서는 객체들의 관계성을 사용하여 순차적으로 수행되는
프로그램내에서 객체들 간에 관계를 형성하여 프로그램을 동작하게한다.
객체 = 데이터 + 기능
ex) 객체 = 자동차
데이터(변수) = 색상, 모델명, 제조사명
기능(메소드) = 엔진가동, 브레이크작동, 기어변속, 에어컨실행등
상속: 부모와 자식 관계 (데이터의 관계성)
상위 클래스에서 모든 것을 상속받아서 사용하는 것 (확장의 개념)
캡슐화: 데이터와 기능을 보호, 외부로부터 접근은 차단하고 권한 또는
절차 없이 데이터를 변경 또는 기능수행을 할 수 없게 한다. (데이터의 은닉성)
(데이터들을 관련이 있는 집단별로 응집하여 캡슐에 담아둔다고 생각)
추상화: 추상적인 요소들을 묶어서 분류하는 것(데이터의 구조화)
여러가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용
다형성: 객체의 기능이 다양한 형태를 가질 수 있다(상속과 깊은 관계를 가지게 된다.)
부모 클래스로 부터 상속받은 데이터와 기능을 자식 클래스에서 재정의해서
사용가능하다. (메소드 오버로딩, 오버라이드, 형변환 등)
(절차지향언어의 상대적인 부분)
클래스 (참조 자료형) : 객체에 대하여 정의해 놓은 설계도 혹은 틀
object 객체: 클래스를 통하여 구현 할 수 있는 모든 대상
즉, 해당 클래스로 구현한 인스턴스를 대표하는 의미 (메모리가 할당이 되지 않은 상태)
인스턴스 : 객체가 실제로 구현이 된 것, 존재하는 것 (실제로 메모리 공간을 할당 받은 상태)
클래스명 변수명 = new 클래스명();
자료형 변수명 값 (생성자)
자료형인 클래스가 컴파일 시점에 스택이라는 공간에 할당이 된다.
그 클래스를 선언한 것이 변수명이고 그 변수명에 새로운 생성자를 생성해서
대입을 하는 구조이다.
이때 , 생성자는 동적 메모리 영역에서 할당을 받게 되고 , 그 메모리의 주소를
스택영역에 있는 변수에 담아준다.
그래서 선언한 변수명. 을 붙이면 해당 생성자의 주소 값에 참조가 가능하고
그 생성자에 있는 변수, 메소드 등을 이용할 수 있다.
※ 생성자의 특징:
1. 생성자는 클래스명과 일치한다(절대 변하지 않는다.)
2. 형태는 메소드 형태이다.
3. 기본적으로 정의가 되어야 쓸 수 있지만 , 생성자는 기본적으로 생략이 되어있어 사용가능하다.
// User 클래스정의
public class User {
String username;
String password;
String name;
String email;
// 기본 생성자
User() {}
// 모든 정보를 담는 생성자
User(String username, String password, String name, String email) {
this.username = username;
this.password = password;
this.name = name;
this.email = email;
}
// 담아진 정보를 출력하는 메소드
void printUserInfo() {
System.out.println("아이디: " + username);
System.out.println("비밀번호: " + password);
System.out.println("이름: " + name);
System.out.println("이메일: " + email);
System.out.println();
}
}
================================================
// User 클래스를 쓸 Main 클래스
public class UserMain {
public static void main(String[] args) {
User userA = new User();
// 생성 될 당시에 값을 대입
User userB = new User("sunsin12", "1234", "이순신", + "sunsin12@gmail.com")
// 직접 변수를 참조해서 대입
userA.username = "hong12";
userA.password = "1212";
userA.name = "홍길동";
userA.email = "hong12@gmail.com";
userA.printUserInfo();
userB.printUserInfo();
}
}