- 메소드 (method)

어떤 로직이나 기능을 만들어 내는 방법 (함수)

코드를 재활용 할 수 있도록 하여 경제적으로 코드를 작성할 수 있다.

객체를 생성하여 참조변수를 통해 호출 할 수 있는 함수 (메소드의 특징)

 

접근제어자 [static] 반환타입 메소드명 (매개변수1, 매개변수2, ...)
	메소드 명이 호출되면 실행할 문장;
    ...
	[return 반환값]
}

// 예시
public static int sum (int num1, int num2) {
	int tot = num1 + num2;
    return tot;
}

int result = sum (10,5); 	// 호출

[ ] : 생략가능한 부분

여기서 static자바프로그램이 시작되면 가장 먼저 메모리에 올라간다. 따라서 static이 메소드에 있으면 따로 객체를 생성하지 않아도 사용이 가능하다.

 

 

- 이름만 호출하면 실행되는 메소드 : 매개변수가 없다.

public void method1() {
	System.out.println("Hello Java!");
}

method1();		// 호출

 

 

- 매개변수(parameter)가 있는 메소드

public void method2 (int num) {
	System.out.println(num);
 }
 
 method2(10); 	// 호출

 

 

- 리턴값이 있는 메소드

public int method3 (int num) {
	....
    return tot;
 }
 
 int result = method3(10);

 

 

- 매개변수가 가변적인 경우 (keyword argument)

public int method4(int ...values) { // 매개변수가 몇개가 될지 모름
	int sum = 0;
    for(int val : values) sum += val;
}

 

 

✔️ 변수의 생명주기

stack에서 만들어진 변수들은 메소드의 { 에서 } 까지가 생명 주기이다.

 

 

- main 메소드

자바 어플리케이션이 실행될 때 가장 먼저 실행되며 프로그램이 구동되는 메소드이다.

JVM이 자동으로 실행시킨다.

 


메소드 사용해보기!

 

사칙연산을 구하는 메소드를 각각 만들어 아래와 같이 출력하는 프로그램을 작성해보자
(단, 메소드는 각 연산 (+, -, *, /)에 따라 별도로 작성, return 키워드를 반드시 사용!

ex ) 첫 번째 숫자를 입력하세요. 10
     두 번째 숫자를 입력하세요. 3

     10 + 3 = 13
     10 - 3 = 7
     ...

package day05;

import java.util.Scanner;

public class Method1 {
    /*문제 -> Method4
    사칙연산을 구하는 메소드를 각각 만들어 아래와 같이 출력하는 프로그램을 작성해보자
            (단, 메소드는 각 연산 (+, -, *, /)에 따라 별도로 작성, return 키워드를 반드시 사용!

    ex ) 첫 번째 숫자를 입력하세요. 10
    두 번째 숫자를 입력하세요. 3

            10 + 3 = 13
            10 - 3 = 7
            ...*/

    public static int plus(int num1, int num2) {
        return num1 + num2;
    }

    public static int minus(int num1, int num2) {
        return num1 - num2;
    }

    public static int multi(int num1,int num2) {
        return num1 * num2;
    }

    public static double div (double num1 , double num2) {
        return num1 / num2;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("첫 번째 숫자를 입력하세요.");
        int num1 = sc.nextInt();
        System.out.println("두 번째 숫자를 입력하세요.");
        int num2 = sc.nextInt();

        System.out.println(num1 + " + " + num2 + " = " + plus(num1,num2));
        System.out.println(num1 + " - " + num2 + " = " + minus(num1,num2));
        System.out.println(num1 + " * " + num2 + " = " + multi(num1,num2));
        System.out.println(num1 + " / " + num2 + " = " + div(num1,num2));
    }
}

위 코드의 결과

div() 메소드의 경우, 매개변수가 double이다. int형인 num1, num2을 담아도 넘치지 않기 때문에 자동형변환이 되어서 double형으로 결과가 나오는 것을 확인할 수 있다.

 


- 객체 지향 프로그래밍 (OOP, Object Oriented Programming)

실제 세계를 모델링하여 소프트웨어를 개발하는 방법을 의미한다.

데이터와 절차를 하나의 덩어리(집합)로 묶어서 생각한다.

여러명이 하나의 프로젝트를 개발하기 좋으나 설계가 힘들다.

 

 

✔️ 절차 지향 프로그래밍

물이 위에서 아래로 흐르는 것 처럼 순차적인 처리가 중요시 되는 프로그래밍이다.

프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다.

대표적인 언어가 C언어이며, 가독성이 좋고 여러명이 개발하기 힘들다.

 

 

✔️ 함수형 프로그래밍

프로그래머에게 프로그래밍의 관점을 갖게하고 코드를 어떻게 작성할지 결정하는 역할을 한다.

모든 것을 함수로 나누어 문제를 해결하는 프로그래밍 기법이다.

작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수에 용이하다.

대표적인 언어로는 클로저, 하스켈, 리스프가 있다.

 


- 클래스(Class)

설계도와 같은 의미

객체의 상태를 저장하는 필드(변수)객체의 행동을 나타내는 메소드(함수)로 구성되어 있다.

 

 

✔️ 객체 (Object)  -> 추상적인 의미

소프트웨어 세계에 구현할 대상을 의미한다.

클래스에 선언된 모양 그대로 메모리에 생성된 실체이다.

 

 

✔️인스턴스 (Instance) 

설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체를 의미한다.

객체를 소프트웨어에 실체화 하면 그것을 인스턴스라고 부른다. (실체화된 인스턴스는 메모리에 할당)

인스턴스는 객체에 포함되는 개념이다.

 

 => 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.

" 객체는 클래스의 인스턴스이다! "

 

 

- 클래스를 만드는 방법

접근제어자 class 클래스명 {
	자료형 필드명1;
    자로형 필드명2 = 값3;
    ...
    
    접근제어자 [static] 반환형 메소드명 (매개변수1, 매개변수2, ..) {
    ...
    }
   ....
}

 


- 생성자(Constructor)

new 연산자로 호출되는 특별한 중괄호 { } 블록이다. 

객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

메소드와 비슷하게 생겼지만 클래스 이름으로 되어있으며, 리턴타입이 없다.

모든 클래스는 생성자가 반드시 존재하며, 코드상에는 보이지는 않지만 JVM에 의해 자동으로 빈 생성자 (기본 생성자)가 만들어져있다.

생성자는 하나이상을 가질 수 있다.

 

 

✔️ 객체의 초기화란? 

필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 하는 것을 의미한다.

 

 

- 생성자 만드는 법

[접근제어자] 클래스명([매개변수1, 매개변수2,...]) {
	생성자가 호출되면 실행할 문장;
    ...
 }

 

✔️ this 연산자

현재 클래스내에 존재하는 필드를 가리킨다.

 

 

✔️ this() 메소드

생성자를 호출해준다.

 

 

✔️ 필드의 선언 초기값

자료형 초기값
byte 0
short 0
int 0
long 0
char \u0000
float 0.0
double 0.0
boolean false
String, 배열, 클래스, 인터페이스 null

 

- 생성자 오버로딩

시그니처가 다르며 같은 이름을 가진 생성자를 여러 개 만드는 것을 오버로딩(Overroading)이라고 한다.

시그니처 : 매개변수의 타입, 이름 전체를 포괄한다.


클래스, 객체, 생성자 사용해보기!

 

1. Student라는 클래스 만들기

2. Oop1 클래스에 메인메소드

3. private 필드 선언

4. 생성자 오버로딩

 

package day05;

public class Student {
    // 필드 선언
    private int no;
    private String name;
    private String hp;
    private int age;
    private String mbti;

    // 기본생성자
    Student() {}

    // 생성자 오버로딩
    public Student(int no, String name, String hp, int age, String mbti) {
        this.no = no;
        this.name = name;
        this.hp = hp;
        this.age = age;
        this.mbti = mbti;
    }

    // 필드가 private로 선언되었기 때문에 값을 세팅하고, 접근할 메소드들
    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHp() {
        return hp;
    }

    public void setHp(String hp) {
        this.hp = hp;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getMbti() {
        return mbti;
    }

    public void setMbti(String mbti) {
        this.mbti = mbti;
    }

    public void info() {
        System.out.println("[학번 : " + no + ", 이름 : " + name + ", 전화번호 : " + ", 나이 : " + age +
                " , MBTI : " + mbti + "]");
    }

}
package day05;

public class Oop1 {
    public static void main(String[] args) {
        Student apple = new Student(); // 객체 생성 및 생성자호출
        apple.setNo(1);
        apple.setName("김사과");
        apple.setHp("010-1111-1111");
        apple.setAge(22);
        apple.setMbti("ISTJ");

        apple.info();

        Student banana = new Student(2,"반하나","010-2222-2222", 20, "ENFP");
        banana.info();

    }
}

위 코드의 결과

복사했습니다!