자바에서 class를 구성하는 요소는 필드(field)와 메소드(method)입니다.
메소드는 기능을 위한 명령들의 집합이라고 할 수 있는데요.
메소드를 이용하여 중복되는 코드의 반복적인 프로그래밍을 피할 수 있기 때문입니다.
그렇게 되면 프로그램에 문제가 생기거나 기능을 바꿀 때에도 보다 쉽게 유지 보수가 가능하게 되겠죠?
접근제한자 메모리타입 리턴타입 메소드명(파라미터or아규먼트 -> 매개변수){
//명령
}
메소드의 선언 형태는 위와 같습니다.
대표적인 메소드로 메인메소드가 있는데요.
메인 메소드의 형태를 보면
public(접근제한자) static(메모리영역) void(리턴타입) main(메소드이름)(String[] args(파라미터)){
}
이렇게 되는데요.
접근제한자 : 해당 메소드에 접근할 수 있는 범위를 정해줍니다.
메모리영역 : static과 non-static으로 구분됩니다.
리턴타입 : 메소드가 명령을 수행하고 리턴할 값의 타입을 정해줍니다. 리턴타입이 없을 경우 void를 사용합니다.
메소드명 : 메소드의 이름입니다.
파라미터(매개변수) - 메소드 외부에서 전달된 값을 내부에서 사용하기 위한 변수
아규먼트 - 메소드 외부에서 전달해 주는 값
다음과 같습니다.
메소드에서 개인적으로 가장 중요하다고 생각되는 접근 제한 자부터 알아보겠습니다.
접근 제한자는 4가지로 분류될 수
1.접근제한자
public( + ) - 어디서나 접근 가능, 참조 가능
protected( # ) - 상속된 경우 상속된 곳에서, 같은 패키지 내에서 참조 가능
(default)( ~ ) - 같은 패키지 내에서만 참조 가능
private( - ) - 현재 클래스 내에서만 참조 가능
package com.test01;
public class MethodTest01 {
// main method : 프로그램의 주 진입점
public static void main(String[] args) {
//class.method();
MethodTest01.publicMethod();
MethodTest01.protectedMethod();
//같은 클래스 내부에 있는 메소드를 호출할 떄는, class 생략 가능!
defaultMethod();
privateMethod();
}
//public : 어디서나 접근, 참조 가능(+)
public static void publicMethod() {
System.out.println("public method 호출!");
}
//protected : 상속일 경우 상속된 곳에서, 상속이 아닌 경우 같은 패키지 내에서 (#)
protected static void protectedMethod() {
System.out.println("protected method 호출!");
}
// (default) : 같은 패키지 내에서만 (~) code에는 쓰지 않고 부를 때만 default라고 부름
static void defaultMethod() {
System.out.println("default method 호출!");
}
// private : 현재 클래스 내에서만 (-)
private static void privateMethod() {
System.out.println("private method 호출!");
}
}
MethodTest01 class 안에 main메소드 이외에 4개의 메소드를 만들었습니다.
각 메소드마다 접근제한자가 다르게 붙어있습니다.
하지만 전부 같은 class 안에 있기 때문에 호출이 가능한데요.
메소드를 호출할 때는 class명.method명(); 으로 호출이 가능합니다.
하지만 같은 class 내에 있을 때는 class 명을 생략할 수 있습니다.
package com.test01;
public class MethodTest02 {
public static void main(String[] args) {
MethodTest01.publicMethod();
MethodTest01.protectedMethod();
MethodTest01.defaultMethod();
//MethodTest01.privateMethod(); //접근할수 없는 메소드 호출시 에러발생!
//MetiodTest01.abc(); //만들지 않은 메소드를 호출하면 에러발생!
}
}
같은 패키지 안에 Method02 class를 만들어서 호출을 하게 되면 public, protected, (default) 접근제한자의 메소드만 호출이 가능합니다.
또한 private로 접근 제한되어 있는 메소드를 호출하게 되면 에러가 발생하고 만들지 않은 메소드를 호출해도 에러가 발생합니다.
2. 메모리영역
메모리 영역은 static과 non-static으로 구분된다고 할 수 있습니다.
먼저 static 메소드일 경우 메소드를 호출할 때 class명.method명(); 으로 호출하는데 non-static 메소드의 경우는 조금 다릅니다.
package com.test01;
public class NonStaticMethodTest01 {
public static void main(String[] args) {
/*
Class 변수 = new class();
변수.method명()
*/
NonStaticMethodTest01 nsm = new NonStaticMethod01();
nsm.nonStaticPublicMethod();
nsm.nonStaticProtectedMethod();
nsm.nonStaticDefaultMethod();
nsm.nonStaticPrivateMethod();
}
//public : 어디서나 접근, 참조 가능(+)
public void nonStaticPublicMethod() {
System.out.println("non-static public method 호출!");
}
//protected : 상속일 경우 상속된 곳에서, 상속이 아닌 경우 같은 패키지 내에서 (#)
protected void nonStaticProtectedMethod() {
System.out.println("non-static protected method 호출!");
}
// (default) : 같은 패키지 내에서만 (~) code에는 쓰지 않고 부를 때만 default라고 부름
void nonStaticDefaultMethod() {
System.out.println("non-static default method 호출!");
}
// private : 현재 클래스 내에서만 (-)
private void nonStaticPrivateMethod() {
System.out.println("non-static private method 호출!");
}
}
non-static 메소드의 경우에는 new 키워드로 객체를 만들어야 호출이 가능합니다.
다른 클래스에서 호출할 경우에도 접근 제한자의 범위에 맞지 않거나 만들지 않은 메소드를 호출할 경우에도 에러가 발생합니다.
package com.test01;
public class NonStaticMethodTest02 {
public static void main(String[] args) {
NonStaticMethodTest01 nsm = new NonStaticMethodTest01();
nsm.nonStaticPublicMethod();
nsm.nonStaticProtectedMethod();
nsm.nonStaticDefaultMethod();
nsm.nonStaticPrivateMethod(); //접근할수 없는 메소드 호출시 에러발생!
//nsm.abc(); //만들지 않은 메소드를 호출하면 에러발생!
}
}
다른 패키지에서 호출을 해보겠습니다.
package com.test02;
import com.test01.MethodTest01;
import com.test01.NonStaticMethodTest01;
public class MethodTest03 {
public static void main(String[] args) {
MethodTest01.publicMethod();
//MethodTest01.protectedMethod();
//MethodTest01.defaultMethod();
//MethodTest01.privateMethod();
NonStaticMethodTest01 nsm = new NonStaticMethod01();
nsm.nonStaticPublicMethod();
}
}
다른 패키지에서 메소드를 호출할 경우 public을 제외한 모든 접근제한자 호출이 불가능합니다. protected의 경우 상속되지 않아서 호출이 불가능합니다.
상속은 추후에 다뤄보도록 하겠습니다.
3. 리턴타입
리턴 타입은 메소드의 기능을 수행하고 수행된 값을 어떤 형태로 반환할지 정해주는 역할을 합니다.
int a = 1;
int b = 5;
public static int sumMethod01(){
int sum = a + b; return sum;
}
위의 예시를 보면 sumMethod은 int 타입의 sum을 반환시킵니다.
public static void sumMethod02(int i, int j) {
int sum = i + j;
System.out.printf("%d + %d = %d\n", i, j, sum);
}
리턴 타입에 void가 사용될 경우입니다.
위의 예시는 외부에서 값을 받아온 i 와 j 를 더한 값이 출력이 되겠네요.
4. 연습문제
1번.
/*
* Student 클래스 안에서 만들어주세요.
* 1. 과목 파라미터 세개를 넣어주면 총점을 리턴하는 getSum 이라는 이름의 메소드를 만들자.
* 2. 총 합 파라미터 한개를 가진 getAvg라는 이름의 메소드를 만드는데, 리턴은 평균을 리턴한다.
* 3. main 메소드에서 위의 메소드들을 호출하여 각각 sum 변수와 avg 변수에 리턴되는 값을 담고,
* 해당 병소들을 출력하자.
*
* + 평균은 소수점 둘쨰자리까지만 출력하자.
*/
2번.
/* School 클래스
1. 어디서나 접근할수 있고, static으로 선언되어 있으며
2. 리턴 타입은 없는 namePrn이라는 메소드를 만들자
파라미터는 String 하나 받을 거고,
받을 값을 가지고 "내 이름은 ??? 입니다." 라고 출력하자.(printf사용하기!)
* 2. 어디서나 접근할수 있고, static으로 선언되어 있으며
* 리턴 타입은 int인 getAge라는 메소드를 만들자.
* 파라미터는 없고, 자신의 나이를 리턴하자.
*
* 3. 같은 패키지 내에서만 접근할수 있고, non-static 이며,
* 리턴 타입은 없는 addrPrn 이라는 메소드를 만들자.
* 파라미터는 String 하나 받을 거고,
* 받은 값을 가지고 "우리 집은 ???입니다."라고 출력하자.(pirntf사용)
*/
//MTest 클래스
//School class에 만들어 놓은 1번 2번 3번 메소드를 호출하여 console에 출력하자.
1번.
package com.test01;
public class Student {
public static void main(String[] args) {
Student.getAvg(Student.getSum(100, 40, 77));
}
public static int getSum(int kor, int eng, int math) {
int sum = kor + eng + math;
System.out.printf("국어 = %d 영어 = %d 수학 = %d 총점 = %d\n", kor, eng, math, sum);
return sum;
}
public static double getAvg(int sum) {
double avg = (double)sum/3;
System.out.printf("평균 = %2.2f", avg); return avg;
}
}
2번.
package com.test02;
public class School {
public static void namePrn(String name) {
System.out.printf("내 이름은 %s 입니다.\n", name);
}
public static int getAge() {
int age = 27;
return age;
}
void addrPrn(String home) {
System.out.printf("우리 집은 %s 입니다.\n", home);
}
}
package com.test02;
public class MTest {
public static void main(String[] args) {
School.namePrn("강씨네");
int age = School.getAge();
System.out.println(age + "살");
School add = new School();
add.addrPrn("서울");
}
}
'Java 관련 > Java' 카테고리의 다른 글
[Java] 달력(calendar) 만들기 (1) | 2021.10.26 |
---|---|
[Java] 인터페이스(Interface) (0) | 2021.10.23 |
[Java] Random()을 이용한 로또 코드(lotto code) (0) | 2021.10.20 |
[Java] 얖은값 복사(Shallow copy), 깊은값 복사(Deep copy) (1) | 2021.10.19 |
[Java] 배열(Array) (0) | 2021.10.18 |