접근제한자 [기타제한자] 리턴타입 메소드이름(데이터타입 변수이름, 데이터타입 변수이름,...){
[return 가지고갈값] ; // 리턴타입이 void가 아닌경우
}
public -> 어디서나 아무나 접근
protected -> 상속관계라면 어디서나 접근
생략 -> 같은 package내에서 아무나 접근
private -> 하나의 class 내부에서만 접근
기타제한자 : static , final , abstract , synchronized
리턴타입
- void : 리턴값이 없다.
- 기본형(primitiveType)
- 객체타입(참조형)
리턴 타입은 반드시 하나만 작성!
기본형과 객체타입은 반드시 메소드 마지막에 return 값 ;이 있어야한다.
메소드이름 : identifier 작성규칙에 의해 개발자가 만드는 이름.
괄호안을 매개변수=인수=파라미터=아규먼트 : 호출하는사람이 가지고 들어오는 값을 담을 변수 선언.
{} 안을 메소드 구현부 = body : 필요한 기능 작성한다.
2) => 3) => 1) 순서대로 해본다.
: 호출하려는 메소드를 감싸고 있는 클래스를 생성한다.
클래스이름 변수이름 = new 클래스이름();
변수이름.메소드이름(인수값, 인수값,....); [호출한 메소드가 리턴값이 없을때]
리턴타입 변수 = 변수이름.메소드이름(인수값, 인수값,....); [만약 호출한메소드가 리턴값이 있을때]
- 객체생성 하지 않고
**클래스이름.메소드이름(인수값, ....);**
ex) Math.random();
Integer.parseInt(문자열);
: this.메소드이름(인수값, 인수값....); //this. 은 생략도 가능하다.
※ keyword : 사전 초기화 (메모리 할당)되어 공유 가능
class 앞에는 올 수 없다. (단, Inner class에는 사용가능)
ex) static class Test{ } ⇨ X
㉠ 전역변수 앞에만 사용가능 ex) static int i;
㉡ 객체생성 없이 외부에서 class이름.변수이름 호출가능
ex) System.in; System.out;
㉢ static변수는 같은 class들이 공유하는 공유변수이다
㉠ 객체생성 없이 class이름.mehtod이름( [값,값,…] ); 호출가능
ex) Integer.parseInt(); Math.random();
㉡ static method는 일반(static이 없는) method 호출 안됨.
㉢ static method는 static method만 호출 가능.
㉣ static method안에서 this 키워드 사용 안됨.
⇨ 같은 class 내에 static method 호출할 때 => method이름( [값, ... ] );
ex) static{
기능 구현 ;
}
⇨ class 내부에 선언되어 main method보다 먼저 실행된다.
⇨ method, 생성자 등의 영역 안에서는 선언 될 수 없다
package day03;
public class StaticExam {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("***********메인 시작입니다.**************");
// static cc call
B.cc(0);
System.out.println("***********메인 종료입니다.**************");
}
}
/**
* 하나의 ~.java 문서 안에는 클래스 여러개 작성 가능!
* 1. public class는 단 한개만 가능(반드시 public class 이름으로 파일명이 만들어져야 하기 때문)
* 2. main 메소드는 public 클래스 안에 작성한다.
**/
class B {
public void aa() {
System.out.println("aa() call...");
bb("안녕");
this.bb("하이");
dd("되니?", 5);
this.dd("되니?", 5); // 권장하지 않는 방법
B.dd("되니?", 5);
}
public int bb(String s) {
System.out.println("bb(String s) call...");
return 4;
}
public static void cc(int i) {
System.out.println("cc(int i) call...");
// this.dd();
B.dd("Hello", 3);
// aa(); // static 메소드 안에서 non-static 호출 안됨
}
public static char dd(String s, int i) {
System.out.println("dd(String s, int i) call...");
return 'A';
}
}
class A {
}
package day03;
public class StaticVariableExam {
// Field 선언 = 전역변수 = 멤버필드
int i=10; // 인스턴스 필드, 즉 객체를 생성해야만 접근 가능
static int j=4; // 객체를 생성하지 않고 접근 가능, 공유 변수
// non-static 영역에서 static, this 모두 가능
public void aa() {
System.out.println(i);
System.out.println(this.i);
System.out.println(j);
System.out.println(this.j);
System.out.println(StaticVariableExam.j);
}
public static void bb() {
// System.out.println(i); non static i 는 접근 못함
// System.out.println(this.i); static에서 this 사용x
System.out.println(j);
// System.out.println(this.j); static에서 this 사용x
System.out.println(StaticVariableExam.j);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("--------non-static variable TEST--------");
StaticVariableExam se1 = new StaticVariableExam();
StaticVariableExam se2 = new StaticVariableExam();
StaticVariableExam se3 = new StaticVariableExam();
System.out.println(se1);
System.out.println(se2);
System.out.println(se3);
// 값 변경
se1.i = 100;
System.out.println("--------값 변경 후-------");
System.out.println("se1.i = "+se1.i); // 이 값만 변경 (주소에 할당된 인스턴스 주소가 다르기 때문)
System.out.println("se2.i = "+se2.i);
System.out.println("se3.i = "+se3.i);
System.out.println("--------static variable TEST--------");
System.out.println(se1);
System.out.println(se2);
System.out.println(se3);
// 값 변경
// se1.j = 100;
StaticVariableExam.j = 50; // 모두 같은 주소를 가리키고 있다. (공유 값)
System.out.println("--------값 변경 후-------");
System.out.println("se1.j = "+se1.j);
System.out.println("se2.j = "+se2.j);
System.out.println("se3.j = "+se3.j);
}
}
현재 생성된 객체를 뜻함
현재 객체의 전역변수를 뜻함 (지역변수와 전역변수이름이 같을 때 주로 사용한다.)
현재 객체의 메소드를 호출
현재 객체의 다른 생성자 호출
반드시 생성자 구현부 첫줄에서만 가능하다!
① 하나의 class 내부에 method이름이 같은 method 여러 개 있는 것
② 하나의 method이름을 가지고 기능을 다르게 구현하는 것 ⇨ 이용자 편의
③ 작성규칙
modifier(접근제한자) 같아도 달라도 상관없음.
returnType 같아도 달라도 상관없음.
method이름 반드시 같아야 한다.
단, 인수는 무조건 인수의 순서 or Type or 개수가(셋 중하나가) 달라야 한다.
※ 인수를 0개 이상 전달할 수 있는 문법
public void aa(int i){} // 정수 한 개 무조건
public void aa(int ...i){} //정수 0개 이상 허용
① 특별한 method이다.
② 반드시 method이름이 class이름과 같다. (method이름이 대문자로 시작)
③ 일반적인 method선언과 같지만 returnType 자리가 없다.
⇨ modifier class이름( [ dataType 변수이름, ... ] ){ }
④ 객체가 생성(new)되는 시점에 딱 한번 호출한다.
⑤ java의 모든 객체는 반드시 한 개 이상의 생성자를 갖는다.
⑥ Overloading이 가능하다.
⑦ 프로그래머가 생성자를 하나도 작성하지 않으면 default 생성자가 만들어진다.
⇨ modifier class이름( ){ }
㉠ 전역변수를 0에 준하는 값으로 초기화 ex) int i; ⇨ 0
㉡ 전역변수를 명시적 초기화 (프로그래머가 직접 값을 입력) ex) int i=5;
㉢ 생성자 구현부 실행
this([값, 값, ... ]); ⇨ 반드시 생성자 구현부 첫 번째 줄에서만 가능
package day03;
public class ConstructorExam {
public ConstructorExam() {
this("하이");
// this("3"); 하나의 생성자에서는 하나의 생성자만 호출 가능
System.out.println();
}
public ConstructorExam(int i) {
System.out.println(2);
}
public ConstructorExam(String s) {
this(3); // no parameter 생성자 -> String 생성자 -> int 생성자 순으로 호출
System.out.println(3);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
객체가 생성되는 시점에서 해야 할 일이 있다면 생성자에 작성해놓으면 호출하지 않아도 자동 호출되어 일을 하게 된다.
// 학생을 관리하고 싶다!
String names[] = new int [25];
int ages[] = new int [25];
String addrs = new String [25];
// 관리가 너무 어렵다! -> 속성을 관리할 객체를 만들자는 생각!
// VO(Value Object), DTO(Data Transfer Object), Domain
class Student {
// 학생이 가질수 있는 속성 선언 = Field
String name;
int ages;
String addrs;
Student(String name, int ages, Spring addrs){
this.name = name;
this.ages = ages;
this.addrs = addrs;
};
}
Student st1 = new Student("희정", "30", "서울");
// **객체타입도 배열로 관리할 수 있다.
// 학생 = Student 5명을 관리할 배열 만들자.
Student [] stArr = new Student[5]; // Student 객체가 들어갈 배열 방 5개를 만든것
stArr[0] = new Student("희정", 20, "서울");