/*
메서드(method)
메서드는 객체의 동작에 해당하는 중괄호{}블럭을 갖는다. 중괄호 블럭은 이름ㄷ을 가지고 있는데
이것이 메서이름이다. 메서드를 호출하게 되면 이 중괄호 블럭에 있는 실행문들이 일괄적으로
실행된다.
메서드는 1) 필드를 읽거나 수정 2) 다른객첼글 생성해서 다양한 기능을 수행한다. 멧허든느 객
체간에 데이터 전닰수단으로 사용된다. 메서드는 외부로부터 매개값을 받을 수 있고 실행한 후
그 결과를 리턴할 수 있다.
1. 메서드 선언
메서드의 선언은 선언부와 실행부로 구성된다. 선언부에는 접근제한자, 리턴타입, 메서드이름과
매개변수 등을 선언하고 이 선언부를 매서드 시그니처(method signature)라고도 한다. 메서드의
실행부는 중괄호{}블럭을 말한다.
2. 리턴타입
리턴타입은 메서드가 실행한 결과를 리턴할 때 그 값의 데이터타입을 말한다. 메서드는 리턴값이
있을 수도 있고 없을 수도 있다. 리턴값이 없을 경우에는 '리턴타입을 void'로 선언하고 있을 경우에는
반환되는 값의 데이터타입(기본타입, 참조타입)을 정의한다.
3. 메서드의 명명 규칙
1) 숫자로 시작불가
2) $, _ 제외한 특수문자 사용 불가
3) 관례로 메서드이름은 소문자로 시작
4) 카멜케이스를 준수
*/
public class Calculator {
// 실습. 사칙연산을 하는 기능을 가진 계산기 클래스 구현하기
// powerOn, add, sub, mul, div, powerOff 메서드를 구현
// powerOn/Off를 제외한 4가지 메서드는 리턴값이 있게 구현
public void powerOn() {
System.out.println("ON");
}
public int add(int x, int y) {
return x + y;
}
public int sub(int x, int y) {
return x - y;
}
public int mul(int x, int y) {
return x * y;
}
public double div(int x, int y) {
return x / y;
}
public void powerOff() {
System.out.println("OFF");
}
String xxx(boolean val) {
if(val) {
return "true : 참조타입 String(문자열)을 반환";
}else {
return "false : 참조타입 String(문자열)을 반환";
}
} String yyy() {
return new String("참조타입");
} Calculator zzz(){
// Calculator cal = new Calculator();
// return cal;
return new Calculator();
}
}
public class CalculatorMain {
public static void main(String[] args) {
// Calculator객체를 생성하고 add~div까지 구현
Calculator cal1 = new Calculator();
cal1.powerOn();
int result1 = cal1.add(10,20);
int result2 = cal1.sub(20,10);
int result3 = cal1.mul(10,10);
double result4 = cal1.div(10,3);
System.out.println("add = "+ result1);
System.out.println("sub = "+ result2);
System.out.println("mul = "+ result3);
System.out.println("div = "+ result4);
cal1.powerOff();
String result5 = cal1.xxx(true);
System.out.println("xxx= "+result5);
String result6 = cal1.yyy();
System.out.println("yyy= "+result6);
System.out.println();
Calculator result7 = cal1.zzz();
System.out.println("result7.add() = "+result7.add(123,123));
System.out.println("result7.div() = "+result7.div(123,123));
}
}
instance에 관한 내용
/*
클래스(~.class) 멤버 vs 인스턴스(객체)멤버
1. 클래스 멤버 : 클래스관점에서 정의된 필드, 생성자, 메서드
2. 인스턴스 멤버 : 객체(인스턴스) 관점에서 본 필드, 메서드
클래스(~.class)멤버는 객체멤버가 아니기 때문에 객체생성없이도 사용할 수 있지만
객체멤버는 객체가 생성된 후에 사용할 수 있다.
*/
public class Car {
static String company = "포르쉐"; // 클래스(정적)멤버
String model; // 객체멤버
int speed; //객체멤버
@Override
public String toString() {
// return super.toString();
return this.company+","+this.model+","+this.speed;
}
public static void xxx() {
System.out.println("static method 호출");
}
}
public class CarMain {
public static void main(String[] args) {
// static(정적, 고정된)
Car car1 = new Car();
String com = car1.company;
System.out.println("회사이름 = " +com);
System.out.println("모델이름 = " +car1.model);
System.out.println("모델이름 = " +car1.speed);
System.out.println(car1.toString());
car1.xxx();
System.out.println();
System.out.println("회사이름 = " +Car.company);
Car.xxx();
// 객체멤버이기 때문에 클래스로 접근불가
// System.out.println("회사이름 = " +Car.model);
// System.out.println("회사이름 = " +Car.speed);
}
}
static에 관한 내용
/*
정적멤버와 static
정적(static)은 "고정"된 뜻을 가지고 있다. 정적멤버는 클래스에 고정된 멤버로서
객체를 생성하지 않아도 사용할 수 있는 필드와 메서드를 말한다.
이들을 각각 정적필드, 정적메서드라고 부른다. 정적멤버는 객체(인스턴스)에 소속된
멤버가 아니라 클래스(~.class)에 소속된 멤버이기 때문에 클래스멤버라고도 한다.
정적필드와 정적메서드는 클래스에 고정된 멤버이므로 클래스로더가 클래스파일(~.class)\
을 로딩할 때 메서드(클래스)메모리영역에 로딩을 해서 클래스별로 관리가 된다.
필드를 선언할 때 인스턴스멤버로 선언할 것인지 아니면 클래스(정적)멤버로 선언할 것
인지의 판단 기준은 각 객체마다 고유하게 독립적으로 가지고 있어야 할 데이터라면 객체
(인스턴스)멤버로 선언하고 객체마다 가지고 있을 필요가 없는 즉, 공통적으로 사용할
데이터라면 정적맴버로 선언하는 것ㅊ이 좋다.
*/
public class Calculator {
static final double PI = 3.141592; // 정적멤버
double pi = 3.14; // 객체멤버
static int add(int x, int y) {return x + y;} // 정적멤버
int mul(int x, int y) {return x * y;} //객체멤버
}
/*
정적메서드와 정적블럭 사용시에 주의할 점
정적메서드와 정적블럭을 선언할 때 주의할 점은 객체가 생성되지 않아도 즉, 객체가
없어도 실행된다는 특징때문에 정적메서드와 정적블럭 내부에 인스턴스필드나 인스턴스
멤버를 사용할 수 없다. 또한, 객체 자신의 참조키워드인 this도 사용할 수 없다.
정적메서드와 정적블럭에서 객체멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조
변수로 접근해야 한다.
또한, main 메서드도 정적메서드이기 때문에 동일한 규칙이 적용된다. 이런 이유로
main메서드가 객체 생성없이 객체멤버(필드와 메서드)를 바로 사용할 수 없다.
정적초기화블럭
정적초기화블럭은 클래스가 메모리로 로딩될 때 자동으로 실행되는 블럭이다.
정적블럭은 클래스 내부에 여러개 선언도 가능하다.
정적블럭은 클래스가 메모리로 로딩될 때 선언된 순서로 실행이 된다.
*/
Singleton에 관한 내용
/*
싱글톤(singleton) 디자인패턴
프로그램에서 단 한개의 객체만 생성되도록 해야 하는 경우가 있는데
객체가 단 한개만 생성된다고 해서 이러한 객체를 singleton객체라고 한다.
싱글톤객체를 만드는 방법
1. 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 하는데
그 이유는 생성자를 호출한 만큼 객체가 생성되기 때문이다.
생성자를 외부에서 호출할 수 없도록 하려면 생성자에 접근제한자
private으로 선언해 외부에서 접근하지 못하도록 한다.
2. 자신의 참조타입인 정적필드를 하나 선언하고 자신의 객체를 생성해서
초기화한다. 이 객체를 외부에서 접근하지 못하도록 private 로 선언.
3. 생성된 객체를 외부에서 접근하도록 getter메서드를 선언해서 생성된 객체를
리턴하도록 해서 외부에 전달할 수 있도록 한다.
*/
public class Singleton {
private Singleton(){}
private static Singleton singleton = new Singleton();
static Singleton getInstance() {
// if(singleton == null) singleton = new Singleton();
return singleton;
}
}
final에 관한 내용
/*
final 필드와 static final(상수)필드
1. final 필드
final이라는 의미는 최종적인 의미를 가지고 있다. 이 의미는 final 필드는 초기값이
지정되면 더 이상 수정할 수 없다는 것이다.
final필드의 초기값을 지정하는 방법은 2가지 방법밖에 없는데
1) 필드선언시 초기값을 부여하는 방법
2) 생성자를 통해서 객체를 생성할 때 final필드에 초기값을 부여하는 방법
단순값이라면 필드선언시에 부여하는 것이 제일 간단하지만 복잡한 초기화코드가
필요하거나 객체 생성시에 외부데이터로 초기화해야할 경우 생성자에서 객체가
생성될 때 초기값을 부여한다
생성자는 final 필드를 초기화해야 하는데 만약 초기화되지 않은 final필드가
있을 경우에 컴파일(문법)에러가 발생된다.
2. static final 필드
일반적으로 불변의 값을 상수라고 한다. 불변값은 수학에서 자주 사용하는 원주율의
PI값 or 지구의 둘레, 무게 등이 해다오딘다.
이런 불변의 값을 저장하는 필드를 자바에서 상수(constant)라고 한다. final 필드는
한번 초기화가 되면 더 이상 변경할 수가 필드이지만 상사라고 하지 않는다.
왜냐하면 불변의 값은 객체마다 저장할 필요가 없는 공통으로 사용되는 값으로 여러 가지
값으로 초기화 될 수 없기 때문이다.
final 필드는 객체마다 저장되고 생성자의 매개값을 통해서 여러가지 값을 객체별로
가질 수 있기 때문에 상수가 될 수 없다.
그래서 Java에서의 상수는 final이면서 static이어야 한다. static은 정적멤버이기
때문에 객체마다 저장되지 않고 클래스에만 포함된다. 그리고 한번 초기화가 되면
그 이후에는 수정할 수가 없다.
*/
public class Korean {
static final String NATION = "대한민국"; // 1. 초기화 1st방법
String name;
final String ssn;
public Korean(String name, String ssn) { // 2. 초기화 2nd방법
this.name = name;
this.ssn = ssn;
}
@Override
public String toString() {
return "Korean [NATION ="+NATION +", name=" + name + ", ssn=" + ssn + "]";
}
}
'일 > JAVA' 카테고리의 다른 글
java06.inheritance (0) | 2023.05.25 |
---|---|
java05.class.package (0) | 2023.05.24 |
java05.class.member (0) | 2023.05.24 |
java05.class.class (0) | 2023.05.24 |
java04. ref_type (0) | 2023.05.24 |