티스토리에 저장했던 글을 옮겼습니다.
https://mrcocoball.tistory.com/76
https://mrcocoball.tistory.com/77
https://mrcocoball.tistory.com/78
리턴타입 메소드이름 ( [매개 변수 선언, ...] ) {
실행할 코드를 작성하는 곳 (메소드 실행 블록)
}
// 리턴 타입 : 메소드가 리턴하는 결과의 타입을 표시
// 메소드 이름 : 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어줌
// 매개 변수 선언 : 메소드 실행 시 필요한 데이터를 받기 위한 변수를 선언
// 메소드 실행 블록 : 실행할 코드를 작성
void powerOn() { ... }
double divide( int x, int y ) { ... }
powerOn();
double result = divide(10, 20);
divide(10, 20);
double divide( int x, int y) { ... }
double result = divide(10, 20);
public class Calculator {
// 메소드
void powerOn() {
System.out.println("전원을 켭니다");
}
int plus(int x, int y) {
int result = x + y;
return result;
}
double divide(int x, int y) {
double result = (double) x / (double) y; // int로 매개값을 받았으나 double로 변환
return result;
}
void powerOff() {
System.out.println("전원을 끕니다");
}
}
public class CalculatorExample {
public static void main(String[] args) {
Calculator myCalc = new Calculator();
myCalc.powerOn();
int result1 = myCalc.plus(5,6); // 메소드 호출 시점에서 매개값 지정하였음
System.out.println("result1 : " + result1);
byte x = 10;
byte y = 4;
// 메소드 호출 전 x, y 변수 지정 후 값을 입력하였음
double result2 = myCalc.divide(x,y); // 메소드 호출 시 x,y 매개값 지정하였음
System.out.println("result2 : " + result2);
myCalc.powerOff();
}
}
int sum1(int[] values) { }
int[] values = { 1, 2, 3 };
int result = sum1(values);
int result = sum1(new int[] {1,2,3,4,5});
int sum2(int ... values) { }
int result = sum2(1, 2, 3);
int result = sum2(1, 2, 3, 4, 5);
int[] values = {1,2,3};
int result = sum2(values);
int result = sum2(new int[] {1,2,3,4,5});
return 리턴값;
[Case 1]
int plus(int x, int y) {
int result = x + y;
return result;
System.out.println(result);
// Unreachble code, 컴파일 에러 (return 이후 메소드가 종료되지만 실행문이 남아있음)
[Case 2]
boolean isLeftGas() {
if(gas==0} {
System.out.println("gas가 없습니다.");
return false;
}
System.out.println("gas가 있습니다.");
return true;
}
// 조건문이며 조건에 따라 false와 true를 실행하며 메소드가 종료되기 때문에 컴파일 에러가 발생하지 않음
return;
[외부]
void 외부메소드() { // 객체의 메소드를 호출해옴 (참조 변수 사용)
Idol idol = new Idol();
idol.run();
idol.stop();
idol.singing();
}
[객체 내부]
// 메소드 선언
void run() { }
void stop() { }
void singing() { }
void 내부메소드() { // 위의 메소드 선언부를 호출함
run();
stop();
singing();
}
public class ClassName {
void method1 (String p1, int p2) {
}
void method2 {
method1("리코", 100)
}
}
// method2 에서 method1을 호출
// method1의 매개값에 method2의 값을 대입하여 실행
타입 변수 = 메소드(매개값, ...) ; (타입 -> 메소드 리턴 타입과 동일, 혹은 자동 타입 변환이 되어야 함)
public class ClassName {
int method1(int x, int y) {
int result = x + y;
return result;
}
void method2() {
int result1 = method1(10, 20); // result1에는 30 저장
double result2 = method1(10, 20); // result2에는 30.0 저장
}
}
클래스 참조변수 = new 클래스 (매개값, ...);
[Idol 클래스]
Idol idol = new Idol();
idol.goLesson();
idol.run()
int energy = idol.getEnergy();
public class Idol {
// 필드
int energy;
// 생성자
//메소드
int getEnergy() {
return energy;
}
void goLesson() {
System.out.println("레슨에 참여합니다.");
}
void run() {
for(int i=100; i=0; i-=10) {
energy = i;
System.out.println("레슨을 시작합니다. (에너지:" + energy + ")");
}
}
}
[외부 클래스]
public class IdolExample {
public static void main(String[] args) {
Idol idol = new Idol();
idol.goLesson();
idol.run();
int energy = idol.getEnergy();
System.out.println("현재 에너지: " + speed);
}
}
class 클래스 {
리턴 타입 메소드이름 (타입변수, ...) {...}
↕ 상관없음 ↕ 동일 ↕ 매개변수의 타입, 개수, 순서가 달라야 함
리턴 타입 메소드이름 (타입변수, ...) {...}
// int 계산용 method
int plus(int x, int y) {
int result = x + y;
return result;
}
// double 계산용 method
double plus(double x, double y) {
double result = x + y;
return result;
}
int divide(int x, int y) {...}
double divide(int a, int b) {...} // 오버로딩이 아니라 컴파일 에러 발생
void println() {...}
void println(boolean x) {...}
void println(char x) {...}
void println(char[] x) {...}
void println(double x) {...}
void println(float x) {...}
void println(int x) {...}
void println(long x) {...}
void println(Object x) {...}
void println(Sring x) {...}
public class Calculator {
// 정사각형의 넓이
double areaRectangle(double width) {
return width * width;
}
// 직사각형의 넓이
double areaRectangle(double width, double height) {
return width * heigth;
}
}
public class CalculatorExample {
public static void main(String[] args) {
Calculator myCalcu = new Calculator():
// 정사각형 넓이
double result1 = myCalcu.areaRectangle(10);
// 직사각형 넓이
double result2 = myCalcu.areaRectangle(10, 20);
// 결과
System.out.println("정사각형 넓이=" + result1);
System.out.println("직사각형 넓이=" + result2);
}
}
public class Idol {
// 필드
String name;
int energy;
// 생성자
Idol(String name) {
this.name = name; // 매개 변수 name의 값을 필드 name에 저장
}
// 메소드
void setEnergy(int energy) {
this.energy = energy; // 매개 변수 energy의 값을 필드 energy에 저장
}
void run() {
for (int i=100; i = 0, i-=10) {
this.setEnergy(i);
System.out.println(this.name + "가 레슨을 합니다.(에너지:" + this.energy + ")");
// 객체, 메소드가 생성되어야 각각 name, energy를 사용할 수 있음
}
}
}
public class IdolExample {
public static void main(String[] args) {
Idol idol = new Idol("리코");
Idol idol2 = new Idol("요시코")
idol.run();
idol2.run();
}
}
public class 클래스 {
// 정적 필드
static 타입 필드 [=초기값];
// 정적 메소드
static 리턴 타입 메소드 (매개변수선언, ...) { ... }
}
public class Calcualtor {
String color; // 인스턴스 필드
static double pi = 3.141592; // 정적 필드
void setColor(String color) {this.color = color;} // 인스턴스 메소드
static int plus(int x, int y) { return x + y; } // 정적 메소드
static int minus(int x, int y) { return x - y; } // 정적 메소드
static double circle(int x) { return pi * x * x } // 정적 메소드
// Calculator 클래스에서 공통으로 필요한 원주율 파이는 공용 데이터이므로 정적 필드로 선언
// 덧셈 / 뺄셈 메소드는 매개값을 가지고 공통된 연산 처리를 하는 것이므로 정적 메소드로 선언
// 단, Calculator 별로 색깔 / 모델이 다르고 이를 변경처리하는 작업에 대해서는 각각 인스턴스 필드, 메소드로 선언
클래스.필드;
클래스.메소드(매개값, ...);
public class Calculator {
static double pi = 3.141592;
static int plus(int x, int y) {...}
static int minus(int x, int y) {...}
}
double result1 = 10 * 10 * Calculator.pi; // 클래스 이름으로 접근
int result2 = Calculator.plus(10,5); // 클래스 이름으로 접근
int result3 = Calculator.minus(10,5); // 클래스 이름으로 접근
[클래스]
public class Calculator {
// 정적 필드
static double pi = 3.141592;
// 정적 메소드
static int plus(int x, int y) {
return x + y;
}
static int minus(int x, int y) {
return x - y;
}
}
[외부 호출]
public class CalcuatorExample {
public static void main(String[] args) {
double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10,5);
int result3 = Calculator.minus(10,5);
System.out.println("result1 : " + result1);
System.out.println("result2 : " + result2);
System.out.println("result3 : " + result3);
}
}
public class Car {
int speed;
void run() {
System.out.println(speed + "으로 달립니다.");
public static void main(String[] args) {
// speed = 60; -> 인스턴스 필드이므로 main 메소드(정적)에서 바로 사용 불가
// run(); -> 인스턴스 메소드이므로 main 메소드(정적)에서 바로 사용 불가
Car myCar = new Car(); // 객체 생성 후 참조
myCar.speed = 60;
myCar.run();
}
}
public class 클래스 {
// 정적 필드
private static 클래스 singleton = new 클래스();
// 생성자
private 클래스() {}
// 정적 메소드
static 클래스 getInstance() {
return singleton;
}
}
클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();
[싱글톤]
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {}
static Singleton getInstance() {
return singleton;
}
}
[싱글톤 객체]
public class SingletonExample {
public static void main(String[] args) {
/* 해당 부분 컴파일 에러
Singleton obj1 = new Singleton();
Singleton obj2 = new Singleton();
/* 해당 부분 컴파일 에러
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if(obj1 == obj2) {
System.out.println("같은 Singleton 객체입니다.");
} else {
System.out.println("다른 Singleton 객체입니다.");
}
}
}
final 타입 필드 [=초기값];
[final 필드 선언과 초기화]
public class Person {
final String nation = "Korea"; // 선언 시 초기화
final String ssn; // 선언은 하였으나 생성자에서 초기화 진행
String name;
public Person (String ssn, String name) {
this.ssn = ssn; // 생성자에서 초기화 진행, 매개값 = final 필드 값
this.name = name;
}
}
[final 필드 테스트]
public class PersonExample {
public static void main(String[] args) {
Person p1 = new Person("123456-1234567", "최쾅쾅");
System.out.println(p1.nation);
System.out.println(p1.ssn);
System.out.println(p1.name);
//p1.nation = "usa"; → final 필드값이라 변경 불가
//p1.ssn = "654321-7654321"; → final 필드값이라 변경 불가
p1.name = "최껑껑"
}
}
static final 타입 상수 = 초기값;
static final double PI = 3.141592;
static final double EARTH_RADIUS = 6400;
static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS
상위패키지.하위패키지.클래스
A 클래스의 전체 이름 = com.mycompany.A
B 클래스의 전체 이름 = com.yourcompany.B
package 상위패키지.하위패키지;
public class ClassName {...}
com.samsung.projectname
org.apache.projectname
void setSpeed(double speed) {
if(speed <0) {
this.speed = 0;
return; // 속도는 음수가 되어서 안되므로 음수인 경우 0으로 저장하고 실행 종료
} else {
this.speed = speed;
}
}
double getSpeed() {
double km = speed * 1.6; // 필드값 마일을 km 단위로 환산 후 외부로 리턴
return km;
}
private 타입 fieldName;
// Getter
public 리턴 타입 getFieldName() {
return fieldName;
}
// Setter
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
// ※ 필드 타입이 boolean 일 경우엔 Getter는 get으로 시작하지 않고 is로 시작하는 것이 관례
private boolean stop;
public boolean isStop() {
return stop;
}