
전체적인 구조를 알았다면 개별적으로 어떤 특성이 있는지 알아보고 구분해보자
: 객체의 속성값을 지정할 수 있는 클래스에 포함되고 힙메모리에 저장되는 변수
(우리가 아는 int, double 이런거)
❗️필드는 객체에 들어가기 때문에 지역 변수와 구분해야한다
: 메서드에 포함된 변수이다
class A{
//클래스 바로 내부에 있는게 필드!
int m=3; //필드
int n=4; //필드
//상위 중괄호가 메서드인 경우에는 지역변수
void example1( ){
int k=5; //지역변수
System.out.println(k);
example2(3);
}
void example2(int i//지역변수){
int j=4; //지역변수
System.out.println(i+J);
}
}
: 힙메모리에 저장되어 값을 미입력시 강제 초기화!!!!
: Stack 메모리에 저장되어 값을 입력하지 않아서 강제초기화 되지 않음
class A {
boolean a;
int b;
double c;
String d;
void example1(){
int k;
System.out.println(k);//초기값이 없어서 오류
System.out.println(a);//false
System.out.println(b);//0
System.out.println(c);//0.0
System.out.println(d);//null
}
}
: 특정 기능을 수행하는 코드블록
public static int sum (int a, int b) {
접근지정자 제어자 리턴타입 메서드이름 ( )
//메서드의 내용
}
public, static은 수식어이니 뒤에서 알게된다
: 중괄호 안에 실행되고 나서 바뀌는 타입 명시
-> double이면 중괄호 실행 후에 double값으로 바뀐다
실행만 하고 안 바꿀 생각이면 return의 의미가 없어야 하므로 void를 선언한다
pulic static void main(String[] args{..}
리턴타입 void + 매개변수 없음
void print() { // 리턴하지 않는 메서드 사용
System.out.println("안녕");
}
리턴타입 int + 매개변수 없음
int data () { //리턴타입이 있으면
return3; //return을 포함해야함
}
리턴타입 double + 매개변수 2개
double sum(int a, double b) {
return a+b;// 각각 int와 double이지만 동작 후 리턴타입은 double로 나온다
}
:변수의 이름 규칙과 동일하게 잘 작성하면 된다
: 메서드에서 젤 먼저 실행되는 값이고 메서드에게 전달되는 값 *조건식같은 느낌
public class A {
void print(){
System.out.pritnln("붕어빵");
}
int data(){
return 3;
}
double sum(int a, double b){
return a+b;
}
void printA(int m) {
if(m<0 || m>12) {
System.out.pirtnln("꽝");
return;
}
System.out.pritnln(m+"개 당첨")
}
}
class B {
public static void main(String[] ar{
//객체생성
A a = new A();
//참조 변수로부터 메서드 호출
a.print(); //붕어빵
int k = a.data();
System.out.prinln(k); //리턴값으로 3
double result = a.sum(3, 5.2)
System.out.println(result); // 8.2
// 여기서 int a; a=3;으로 선언후 값지정으로 생각해준다 왜냐햐면 배열은 다르게 진행되기 때문이다
// 이건 뒤에서 다룰 예정
a.printA(5);//5개 당첨
a.printA(14); //꽝
}
}
같은 static만 불러올 수 있다는 점 기억!
그냥 바로 호출 가능
public class A {
public static void main(String[] ar) {
print();
int a = twice(3);
System.out.println(a);//6
double b = sum(a, 5.8);
System.out.println(b);
}
public static void print(){
System.out.pritnln("안녕");
}
public static int twice(int k){
return k*2
// 외부와 똑같이 int k; 선언 후, k=3;값대입 진행
}
public static double sum(int m, double n) {
return m+n; //11.8
}
}
배열 매개변수를 가지는 메서드 호출
public static void main(String[] ar){
printArray(new int[](1,2,3});
//int[] a; 선언 후 a = new int[]{1,2,3} 분리작성가능
printArray({1,2,3});
//분리 작성 불가능한데 printArray에 넘어갈 때 분리되기 때문에 오류
}
public static void printArray(int a){
System.out.println(Arrays.toString(a));
}
public static void main(String[] ar) {
int a=3;
int k1=twice(3);//int a; a=3;-> a=6변환
int k2=twice(a);//int a; a=3;-> a=6변환
Sysem.out.prinln(k1);//6
Sysem.out.prinln(k2);//6
Sysem.out.prinln(a);//a의 값 3이 그대로 나온다
//twice 메서드 공간은 사라진다
}
public static int twice(int a){
a=a*2;
return a;
}
public static void main(String[] ar){
int[] array = new int[]{1,2,3};
modifyData(array);//int[]a; a= array
printArray(array);//456이 나온다
}
public static void modifyData(int[] a){
a[0]=4; a[1]=5; a[2]=6; //123에서 456으로 바뀐다
}
public static void printArray(int[] a){
System.out.println(Arrays.toString(a));
}
: 컴파일러는 메서드 시그니처가 다르면 메서드 이름이 동일해도 다른 메서드로 인식한다
메서드 시그니처
: 메서드 이름과 매개변수 타입
❗️리턴타입은 시그니처에 포함되지 않는다
public static void print()..
public static void print(int a)..
-> 두개는 다른 메서드임
public static int print(int a)..
-> 시그니처가 동일하게 존재하므로 오류 -> 오버로딩불가
:다른 메서드이지만 여러 타입이 명시 되어있기 때문에 가능!
++ System.out.println(Object x) 상속으로 개념이 연결된다
: 메서드가 3개 필요하면 3개 다 따로 써줘야 하는데, 그렇게 되면 너무 비효율적이라 그때그때 매개변수를 정할 수 있는 개념
리턴타입 메서드이름 (자료형... 참조변수){ }
public static void method(int...values) {//int 타입을 몇개여도 받겠다는 의미,value에 배열로 저장
System.out.pritnln(~~~);
for(~~~){
System.out.println(___);
}
System.out.println();
}
❗️치명적인 단점... 같은 타입일 때만 효과가 크다
A a = new a();class A{
int m;//생성자가 없더라도 모든 클래스에 생성자가 존재
void work() {
...
}
A() {//이렇게 기본 생성자 추가해준다
}
}
**기본생성자 : 입력매개변수가 없는 생성자**
class A{
int m;
void work() {
...
}
A(int k) {//A a = new A(설정 값);
m=k;
}
//생성자가 1개 이미 있는 경우에는 추가하지 않음
}
: 생성자 n개 -> 객체 생성방법 n개
: 자신이 속한 클래스의 객체
class A{
int m; //필드는 그냥 사용할 수 없다 객체.필드명 사용
int n;
void init(int a, int b){
int c=3;
this.m=a; //this가 이미 객체
this.n=b;//객체 내에서 사용해야한다
}
void work(){
this.init(2, 3);
}
}
❗️만약 메서드 내에서 지역변수와 필드명이 같다면 지역변수로 취급하므로 this 키워드를 작성해줘야한다
class A{
int m;
int n;
void init(int a, int b){
m=m;
//어떤게 필드고 어떤게 지역변수인지 알 수 없음
//둘다 가까운 init메서드의 지역변수로 읽힌다
n=n;
a.init(3,4);
System.out.println(a.m)//강체초기값0
this.m=m;//키워드 명시
this.n=n;
a.init(3,4);
System.out.println(a.m);//필드값의 3 출력
}
}
: 자기 클래스 내부에 다른 생성자를 호출
class A{
A(){
System.out.println("첫번째"); //
}
A(int a){
this();//A()생성자 호출
System.out.println("두번쨰");
}
A a1 = new A(3);//첫번째
//두번쨰 출력
}