36일차 (2) - java (객체지향 - 객체, 필드, 메서드, 클래스, 생성자, 지역변수, equals())

Yohan·2024년 4월 11일
0

코딩기록

목록 보기
52/156
post-custom-banner

객체란?

데이터와 그 데이터를 처리하는 함수들을 묶어놓은 하나의 독립적인 단위

객체의 장점

  1. 코드의 가독성이 좋아짐
  2. 유지보수가 편리
  3. 코드 재사용성이 높아짐
  4. 대규모 프로그램을 개발할 때 유용

클래스, 필드, 메서드

클래스 : 객체를 찍어내는 설계도, 설계도의 역할만 하고 실행은 안함
-> 실행은 main 메서드에서 진행

  • 클래스 안에는 객체의 속성과 기능을 정의
  • 객체의 속성은 필드(field), 객체의 기능은 메서드(method)라고 부름
    -> 단, 필드는 함수안에 들어가는 변수와는 다른 개념임
    -> 메서드는 함수가 아님, 메서드 앞에 static은 붙이지 않음
package day04;
public class Dancer {

    // 클래스에서는 객체의 속성과 기능을 정의

    // 객체의 속성: 객체를 표현하는 데이터
    // --> 필드 (field) , js에서의 프로퍼티
    // 함수 안에 있는 것은 변수라고 부름, 객체 X
    String dancerName; // 댄서 이름
    String crewName; // 팀 이름
    String genre; // 장르
    int danceLevel; // 0: 초보, 1: 아마추어, 2: 프로

    // 객체의 기능: 객체가 할 수 있는 일, 행위
    // --> 메서드 (method), static을 붙이지 않기

    // 자기소개 기능 (함수 X, introduce()는 메서드)
    void introduce() {
        System.out.println("이름: " + dancerName);
        System.out.println("팀명: " + crewName);
        System.out.println("장르: " + genre);
        System.out.println("레벨: " + danceLevel);
    }

    // 춤추는 기능
    void dance() {
        System.out.printf("%s 댄서가 %s춤을 춥니다.\n", dancerName, genre);
    }

    // 생성자 (constructor)
    // 객체가 생성될 때 초기 값을 세팅해주는 함수의 일종
    // 1. 생성자는 함수의 일종인데 반드시 이름이 클래스이름과 같아야 한다.
    // 2. 생성자는 리턴값이 없음, 따라서 void가 생략됨
    Dancer() {
        dancerName = "춤꾼";
        crewName = "팝핀크루";
        genre = "케이팝";
        danceLevel = 0;
    }

    // 생성자는 여러개 만들 수 있음: 생성자 오버로딩
    // 규칙: 파라미터가 달라야 함
    Dancer(String dName) {
        dancerName = dName;
        crewName = "도시의춤꾼들";
        genre = "어반";
        danceLevel = 1;
    }

    Dancer(String dName, String cName) {
        dancerName = dName;
        crewName = cName;
        genre = "어반";
        danceLevel = 1;
    }

    Dancer(String dName, String cName, String gr) {
        dancerName = dName;
        crewName = cName;
        genre = gr;
        danceLevel = 1;
    }
}

main 메서드

실행용 클래스, 객체를 생성해서 객체의 기능을 실행시키는 곳

  • Dancer kim = new Dancer();
    -> new Dancer(); 로 객체를 생성하고 kim이라는 변수에 담는다. kim의 타입은 Dancer
  • kim과 park은 다른 객체이므로 다른 주소값을 가지게 됨 (이후에 생기는 객체들도 모두 다름!)
package day04;
public class DancerMain {

    public static void main(String[] args) {

        // 설계도(클래스)를 통해 객체를 찍어냄(생성)
        Dancer kim = new Dancer();

        // 객체의 속성 부여
        kim.dancerName = "김뽀또";
        kim.crewName = "치즈치즈";
        kim.genre = "스트릿";
        kim.danceLevel = 1;

        kim.introduce();
        kim.dance();
        System.out.println("==================================");

        // 두번째 댄서
        Dancer park = new Dancer();

        park.dancerName = "박격포";
        park.crewName = "전쟁이야";
        park.genre = "케이팝";
        park.danceLevel = 2;

        park.introduce();
        park.dance();
        System.out.println("==================================");

        Dancer hong = new Dancer();
        hong.dance();
        System.out.println("==================================");

        Dancer choi = new Dancer("최폭풍");
        choi.dance();
        choi.introduce();
        System.out.println("==================================");

        Dancer nanana = new Dancer("냐냐냥", "시골크루");
        nanana.dance();
        nanana.introduce();
        System.out.println("==================================");

        Dancer rock = new Dancer("메롱롱", "폭식맨", "락킹");
        rock.introduce();
    }
}

생성자 (constructor)

객체가 생성될 때 초기 값을 세팅해주는 함수의 일종

  • 클래스에서 필드, 메서드를 정의하고 main 메서드에서 실행시킬 수 있지만 생성자를 통해 객체를 생성시킬 수 있다. 또한 생성자는 초기값을 세팅해줄 수 있음

생성자 특징

  1. 생성자는 함수의 일종인데 반드시 이름이 클래스 이름과 같아야함
  2. 생성자는 리턴이 없음. 따라서 무조건 void이기 때문에 생략가능
  3. 생성자는 여러개 만들 수 있음 (생성자 오버로딩)
  4. 생성자를 만들 때는 파라미터가 달라야 함
  • 위 예시를 이어서 보게되면 생성자에 파라미터를 줄 수도 있고, 안줄 수도 있으며 초기값을 세팅해줄 수 있음

필드 vs 지역변수

필드(field)

  • 클래스 내부에 선언
  • 해당 클래스의 모든 메서드에 접근 가능
  • 값을 초기화하지 않아도 각 타입의 기본값으로 자동 세팅
    (정수: 0, 실수: 0.0, 논리: false, 문자(char): ' ', 나머지: null)

지역변수

  • 메서드나 블록 내부에 선언
  • 해당 영역 내에서만 접근 가능
  • 반드시 초기화 되어야함. 초기화되지 않으면 사용불가
package day04;
public class FieldAndLocal {

	// aaa : 필드
    int aaa; 

    // ccc: 매개 변수(parameter) - 메서드 호출시 반드시 필요한 인자값
    void foo(int ccc) {
        int bbb = 20; // bbb : 지역변수

        System.out.println("aaa = " + aaa);
        System.out.println("bbb = " + bbb);
        System.out.println("ccc = " + ccc);
    }
}
  • 위 예시를 main 메서드에서 실행
package day04;

public class FieldMain {

    public static void main(String[] args) {

        FieldAndLocal fl = new FieldAndLocal();

        fl.foo(100);
    }
}

  • 이런 결과를 도출한다. aaa는 필드이므로 값을 초기화하지않아도 0이 나오는 것을 볼 수 있음 (문자, 실수, 논리 등.. 다른 타입이였으면 각 타입의 기본값 도출)

메모리 할당위치

  • 필드 : 객체가 생성될 때 마다 각각의 객체마다 독립적인 메모리 공간에 할당
  • 지역변수 : 해당 변수가 선언된 블록이 실행될 때 마다 스택(stack)메모리에 할당되며, 블록이 종료되면 할당된 메모리가 해제
  • 객체는 생성될 때 마다 heap영역에 새로운 공간에 할당된다. 그리고 stack에 변수가 할당되며 그 변수에는 객체의 주소값이 들어가서 가리킬 수 있음

문자열 동등 비교 equals()

  • 문자열을 비교하는 것에는 ==equals() 가 존재

==

  • 두 개의 객체가 같은 주소값을 가지는지 확인
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); // true

String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1 == s2); // false
  • 자바에서 기본 타입처럼 문자열을 선언하면 문자열 상수 풀 이라는 곳에 저장
    그리고, 새로운 변수에 기본 타입처럼 문자열을 저장하게 될 때 기존에 이미 존재하는 문자열을 저장하려고 시도하면, 이미 상수 풀에 존재하는 문자열을 재사용 그렇기 때문에 주소값이 같다고 나오게 됨
  • 하지만new String();처럼 문자열을 생성하게 되면 상수 풀에 존재하는 것을 재활용 하는 것이 아닌 새로운 문자열 객체를 생성. 주소값은 다르다고 나올 것이다.

equals()

  • 두 개의 객체가 같은 내용인지 (문자값 자체가 같은지) 를 비교
  • equals()를 뜯어보면 반복문을 통해 한글자씩 확인하면서 같은지를 비교하는 것을 알 수 있음
String s1 = "hello";
String s2 = "hello";
System.out.println(s1.equals(s2)); // true

String s3 = new String("hello");
System.out.println(s1.equals(s3)); //true

결론

  • 문자열 비교할 거면 equals() 쓰자!
  • 객체 타입의 주소값을 비교 할 일은 그렇게 많지 않음
    -> 객체 타입끼리 ==을 사용해서 비교할 일이 많지 않다는 것!!!
profile
백엔드 개발자
post-custom-banner

0개의 댓글