Java Syntax - (8) 클래스 내부 구성요소

가빈·2023년 12월 11일
post-thumbnail

전체적인 구조를 알았다면 개별적으로 어떤 특성이 있는지 알아보고 구분해보자

필드(field)

: 객체의 속성값을 지정할 수 있는 클래스에 포함되고 힙메모리에 저장되는 변수
(우리가 아는 int, double 이런거)

❗️필드는 객체에 들어가기 때문에 지역 변수와 구분해야한다

필드 vs 지역변수

지역변수?

: 메서드에 포함된 변수이다

  • 객체 안에 들어갈 수 없다
  • stack 메모리에 저장
  • 메서드 실행 후에는 stack 메모리에서 삭제
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);
    }
}

초기값

필드의 초기값

: 힙메모리에 저장되어 값을 미입력시 강제 초기화!!!!

  • 숫자 : 0
  • boolean : false
  • 참조자료형 : null

지역변수의 초기값

: 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
    }
}


메서드(method)

: 특정 기능을 수행하는 코드블록

메서드의 구조

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로 나온다
     }

메서드 이름

:변수의 이름 규칙과 동일하게 잘 작성하면 된다

입력 매개변수

: 메서드에서 젤 먼저 실행되는 값이고 메서드에게 전달되는 값 *조건식같은 느낌

외부 메서드 호출

  1. 객체 생성
  2. 참조 변수로 부터 메서드 호출
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));
}

오버로딩(Overloading)

: 컴파일러는 메서드 시그니처가 다르면 메서드 이름이 동일해도 다른 메서드로 인식한다

메서드 시그니처
: 메서드 이름과 매개변수 타입

❗️리턴타입은 시그니처에 포함되지 않는다

public static void print()..
public static void print(int a)..
-> 두개는 다른 메서드임
public static int print(int a)..
-> 시그니처가 동일하게 존재하므로 오류 -> 오버로딩불가

System.out.println()이 다양하게 출력할 수 있는 이유

:다른 메서드이지만 여러 타입이 명시 되어있기 때문에 가능!
++ 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();
  • 필드 초기화

특징

  • 모든 클래스는 생성자가 있다!!
    -> 붕어빵 기계에서 붕어빵이 안나오는게 말이 안되는 것처럼 객체를 생성하는 생성자가 없다는 것은 말이 안 됨
  • 클래스 이름과 동일해야함
  • 반환 타입이 존재하지 않는다
    ❗️ 리턴타입 존재 하지 않는다(생성자)와 리턴타입 하지 않는다(void)는 다른 말

생성자 정의를 안 한 경우

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개



this 키워드 + this()메서드

this 키워드

: 자신이 속한 클래스의 객체

  • 모든 필드와 메서드 활용시에는 소속 표기
  • 표기 없을 시 컴파일러가 자동으로 표기
  • static 메서드 내에서는 this 불가
  • 지역변수에서는 this 안 됨
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 출력
      
    }
   
}

this() 메서드

: 자기 클래스 내부에 다른 생성자를 호출

  • 생성자 내부에서만 사용가능
  • 반드시 중괄호 이후 첫줄에 위치 = 생성자의 첫 줄
  • super()와 동시에 쓸 수 없음
class A{
	A(){
    	System.out.println("첫번째"); //
    }
    
	A(int a){
    	this();//A()생성자 호출
        System.out.println("두번쨰");
    }

	A a1 = new A(3);//첫번째
					//두번쨰 출력 
}
profile
지금부터 시작!

0개의 댓글