TIL_240207

라미·2024년 2월 7일

TIL

목록 보기
10/25
post-thumbnail

클래스와 객체

자바 : 객체지향 언어
객체지향 언어 : 프로그램 구성 요소 - 객체, 객체들이 상호작용 하도록 프로그래밍

클래스 선언

클래스 : 객체를 만들기 위한 틀 (설계도) ex) 자동차 : 객체 / 자동차 설계도 : 클래스

//클래스 선언
public class 클래스명{
//객체의 속성, 행동(method) 정의
}
public class Car{} //Car class 생성

public class Main(
    public static void main(String args[]){
        // Car 객체 생성
        Car car1 = new Car(); 
        Car car2 = new Car();
    }
)

new 연산자 : new 연산자 뒤에 나오는 생성자를 이용하여 메모리에 객체를 생성하라는 명령.
메모리에 만들어진 객체 : 인스턴스(instance)
car1 / car2 : 만들어진 객체를 참조하는 변수

필드(Field 선언)

Field : 각 객체가 가지고 있는 속성

// 이름, 번호를 필드로 가지고 있는 Car class 선언
public class Car{
    //field 선언
    String name;
    int number;
}

// 객체의 속성 이용하기
public class Main(
    public static void main(String args[]){
        // Car 객체 생성
        Car car1 = new Car(); 
        Car car2 = new Car();

        // 생성한 객체의 속성 이용하기
        car1.name = "소방차"; // caa1이 참조하는 객체의 name
        car1.number = "1212"; // car1이 참조하는 객체의 number

        car2.name = "구급차";
        car2.number = "1919";
    }
)

객체의 사용 : 참조변수.변수명 으로 참조변수를 통해 사용한다

메소드(Method) 선언

메소드란?

메소드는 입력값이 있고, 입력값을 받아서 무언가를 한 뒤 결과를 도출한다. 함수와 비슷한 개념
매개변수 : 입력값 / 인자(Argument) - 함수 호출시 전달되는 값, 매개변수(Parameter) - 전달된 인자를 받아들이는 변수
리턴값 : 결과값

public class Myclass{
    public void method1(){
        //method1() 실행시 실행될 코드 작성
    }
}

메서드 선언 : 리턴타입 메소드명(매개변수){//메소드 실행시 수행 될 코드 작성} / return 값이 없는 경우 void 키워드 사용 (return 값이 없는 걸 뜻 한다.)

public class MyClass{
    public void method(){
        System.out.println("method1이 실행");
    }

    public int method2(int y){
        System.out.println("method5 실행");
        y++;
        return y;
    }
}

// 메서드 사용하기
public class MyClassExam{
    public static void main(String args[]){
        MyClass my1 = new MyClass(); //메소드가 정의된 클래스 생성 

        //메서드 사용, 참조변수를 통해 사용
        my1.method(); //method1이 실행 출력 정상 수행 확인

        int result = my1.method2(5); // method2 실행 출력 정상 수행 확인
        System.out.println(result); //6 출력
    }
}

변수의 scope와 static

변수의 스코프 : 변수가 사용 가능한 범위. 보통 변수가 선언된 블럭이 그 변수의 사용범위.

    public class VariableScopeExam {
        int globalScope = 10; // 전역 변수
        static int staticVal = 5;

        public void scopeTest(int value){
            int localScope = 20; // 지역 변수 : 해당 메서드 내에서만 사용 할 수 있다.           
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            // main() : static 메서드
            
            //클래스 메서드는 객체의 생성 없이 인스턴스 필드를 사용할 수 없다.
            System.out.println(globalScope);  //오류 
            System.out.println(localScope);   //오류
            System.out.println(value);        //오류  
            System.out.println(staticVal); // 클래스 메서드에서 클래스 필드 사용이라 오류 x

            VariableScopeExam v1 = VqriableScopeExam();
            VariableScopeExam v2 = VqriableScopeExam();
            v1.staticVal = 10;
            v2.staticVal = 20;

            // 클래스 필드는 인스턴스 생성시 만들어 지는게 아니라 값을 저장할 수 있는 공간이 하나빡에 없어서 값을 공유한다.
            System.out.println(v2.staticVal); //10
            System.out.println(v2.staticVal); //20
        }   
    }

static 키워드 : class가 인스턴스화 하지 않아도 static한 메서드(클래스 메서드), static한 필드(클래스 필드)는 사용할 수 있다.
static 한 메서드(클래스 메서드) 내에서 static 하지 않은 field(인스턴스필드)는 사용할 수 없다->(static한 메서드를 사용하는 시점에 해당 클래스가 인스턴스화 되지 않았을 수 있기 때문이다.)


생성자

생성자 : 객체 생성시 Car car = new Car(); new 키워드 뒷 부분이 생성자다.

  • 생성자는 리턴타입이 없다.
  • 생성자를 사용자가 정의하지 않으면 매개변수가 없는 생성자가 컴파일할때 자동으로 만들어진다. => 기본생성자
  • 생성자를 하나라도 정의했다면 기본생성자는 자동으로 만들어지지 않는다.

생성자의 역할

  • 객체가 될 때 필드를 초기화 한다.
    public class Car{
        String name;
        int number;

        // 사용자가 생성자를 정의했기 때문에 기본 생성자는 자동으로 만들어지지 않는다.
        public Car(String name){ // Car 객체 생성자 객체 생성시 Car 객체는 name을 갖는다.
            this.name = name;
        }
    }

    
    public void mainn(String[] arga){
        //Car 객체 생성
        // Car car1 = new car(); // error : 정의해둔 생성자가 있기 때문에 기본생성자는 자동으로 생성 되지 않아 객체를 생성할 수 없다
        Car car2 = new Car("람카"); // Car class에 정의해둔 생성자, 객체 생성이 가능하다.

    }    

this

this : 현재 객체, 자기 자신을 나타낸다.

this의 사용

    public class Car{
        String name;
        int number;

        // 사용자가 생성자를 정의했기 때문에 기본 생성자는 자동으로 만들어지지 않는다.
        public Car(String name){ // Car 객체 생성자 객체 생성시 Car 객체는 name을 갖는다.
            this.name = name;
        }
    }

this.name : field 의 name 을 의미한다. (Car 객체의 name)
name : 매개변수 name을 의미한다. (외부에서 받은 변수 값 name, 그냥 변수 명이 name 인 것!)
this.name = name : 매개변수의 값을 필드에 대입해라

메서드 오버로딩(Method Overloading)

  • 같은 클래스 내에 같은 이름을 가지면서 매개변수의 개수, 타입, 순서가 다른 여러 메서드를 정의하는 것이다.
  • 메서드의 리턴 타입과 접근 제어자는 영향을 주지 않는다.

메서드 오버로딩 주의사항

  • 메서드의 리턴 타입만 다른 경우에 오버로딩이 불가능하다.
  • 매개변수의 타입이 같고 순서만 다른 경우 오버로딩이 불가능하다.
    class MyClass2{
        public int plus(int x, int y){
            return x+y;
        }

        public int plus(int x, int y, int z){ // 매개변수의 개수 다름 : 오버로딩 성립
            return x + y + z;
        }

        public String plus(String x, String y){// 매개변수의 타입 다름 : 오버로딩 성립
            return x + y;
        }

        public int plus(int i, int f){ //error : 매개변수의 개수, 타입이 동일함. 변수명은 오버로딩에 영향을 끼치지 않는다.
        return i+f;
        }
    }

생성자 오버로딩 & this()

생성자의 매개변수의 유형과 개수가 다르게 하여 같은 이름의 생성자를 여러 개 가질 수 있다.

  • 생성자도 메소드와 마찬가지로 여러개를 선언할 수 있다.
  • 매개변수의 수와 타입이 다르다면 여러개의 생성자를 선언할 수 있다.
    public class Car{
        String name;
        int number;

        public Car(){ // 기본생성자
            this.("이름없음",0); // this() ->  자기 자신의 생성자 호출
        }

        public Car(String name){ // 생성자 오버로딩
            // this.name = name;
            this.(name, 0);
        }

        public Car(String name, int number){ // 생성자 오버로딩
            this.name = name;
            this.number = number;
        }
    }
  • 결국 위 세개의 생성자는 하나의 생성자로 회귀하게 된다.
  • 자기 자신의 생성자를 호출함으로써 비슷한 코드가 중복되서 나오는 것을 방지할 수 있다.

상속

상속이란?

  • 기존 클래스의 특성(멤버 변수와 메서드)을 새로운 클래스에서 이어받아 재사용 하는 것이다.(부모가 자식에게 상속해준다!)

0개의 댓글