Lang/Java

7. 클래스

진욱 김 2023. 3. 27. 17:41
728x90
반응형

1. 객체 지향 프로그래밍

  • 객체 (object)
    • 물건, 대상 등을 의미
    • 상태정보(속성, 데이터) / 변수
    • 행동(기능) / 메서드
  • 객체 지향 프로그래밍
    • 현실에 존재하는 사물, 대상, 그에 따른 행동 등을 실체화 시키는 형태의 프로그래밍
      • 나는 상점에서 물건을 두개 구매했다
      • 나, 상점, 물건 / 객체
      • 사과 두개 / 상태
      • 구매 / 행동
class apple{
  public static void main(String[] args){
    int apple = 20; // 사과의 수, 상태정보, 변수
    int money = 0; // 판매수익, 상태정보, 변수
    int sale = sc.nextInt(); // 판매량, 상태정보, 변수

    //판매행위를 메서드로 표현
    int num = sale/1000; // 개당 1000원
    apple -=num; // 사과 보유량
    money +=sale; // 판매수익
  }
}
  • 객체를 생성하기전, 생성을 위한 틀을 만들어야 한다.
    • 객체 붕어빵 / 틀 붕어빵틀
    • 객체 변수, 메서드 등 / 틀 클래스

2. 클래스

  • 코드화시킨 클래스
    • 필드 : 클래스의 멤버 변수
    • 메서드 : 클래스의 멤버 함수
      class 클래스명 {
      멤버변수;
      메서드();
      }
class Account{
    String accID; // 계좌번호
    String name; // 이름
    int balance; // 잔액

    //2. 메서드
    public void deposit(int money) { // 입금
        balance+=money;
    }
    public void withdraw(int money) { // 출금
        balance-=money;
    }
    public void showInfo() { // 추가 메서드
        System.out.println("계좌번호 : " + accID);
        System.out.println("이름 : "+name);
        System.out.println("잔액 : " + balance);
    }
} //class Account

//클래스 작성 후, 클래스로부터 객체 생성후 사용
//객체를 사용한다는 것 : 객체가 가지고 있는 속성과 기능을 사용

public class AccountTest {

    public static void main(String[] args) {
        //1. 객체 생성 - 해당 클래스의 멤버변수와 메서드를 메모리에 할당
        Account acc;
        acc = new Account();

        //2. 메서드 사용
        acc.showInfo(); // 멤버변수는 자동으로 디폴트값으로 초기화

        //3. 두번째 객체 생성
        Account acc2 = new Account();

        //4. 멤버변수 사용
        acc2.accID = "100-000-2000";
        acc.name="홍길동";
        acc2.balance=1000000;

        //5. 메서드 사용
        acc2.withdraw(30000); // 30000원 출금
        acc2.showInfo();

        acc2.deposit(50000); // 50000원 입금
        System.out.println("현재 잔액 : "+acc2.balance);
    }
}
  • new
    • 객체 생성을 명령
    • 메모리 공간에 객체 생성
    • 클래스의 인스턴스화 (instantiation)
    • 클래스로부터 만들어진 객체 : 인스턴스
  • 객체와 인스턴스
    • 객체 : 모든 인스턴스를 포괄하는 의미
    • 인스턴스 - 어떤 클래스로부터 만들어진 것인지를 강조하는 구체적인 의미
      • 계좌번호는 객체
      • 계좌번호는 Account 클래스의 인스턴스
  • 클래스
    • 클래스에 존재하는 객체는 메모리 공간에 할당되어있지 않음
    • 접근 호출 불가능한, 틀로서만 역할
  • 객체
    • 메모리 공간에 할당됨
  • 클래스의 정의
    • 사용자 정의 자료형을 정의하는 것
    • 서로 관련된 변수들을 정의
    • 이들에 대한 작업을 수행하는 메서드들을 함께 정의

a. 클래스 기반 객체 생성

  • 클래스는 객체가 아니다.

    • 클래스 내 변수에 접근하고 메서드를 호출하기 위해서는 클래스를 객체화시켜야한다.

      클래스이름 변수명 = new 클래스이름();
      Account acc = new Account();

        - Account 객체를 생성하고 이를 acc라는 이름의 변수로 참조
        - acc를 통해 각각의 객체에 접근할 수 있게 된다.
        - acc : 참조변수

      b. 생성된 객체의 접근 방법

  • 객체의 변수에 값 저장

    • Account acc = new Account();
    • acc.balance = 1000000;
  • 객체의 메서드 호출

    • acc.withdraw(30000);
  • .연산자를 이용, 객체에 접근


3. 생성자

a. 생성자란

  • 객체가 생성될 때 자동호출되어 가장 먼저 실행되는 메서드
  • 멤버변수의 초기화 목적
  • new연산자가 힙 영역에 메모리를 생성한 직후 호출
  • 조건
    • 클래스의 이름과 동일한 이름의 메서드
    • 매개변수는 가질 수 있으나 반환값은 가질 수 없다

      클래스이름 변수이름 = new 클래스이름([매개변수]);

  • new연산자 우측 클래스이름 = 생성자

b. 기본생성자(default 생성자)

  • 따로 정해주지 않았을 때 기본으로 제공되는 생성자
    • 컴파일러에 의해 자동으로 만들어진다.
  • 매개변수를 가지지 않는다.
  • 다른 생성자가 있으면 컴파일러에 의해 default 생성자가 만들어지지 않는다.
  • 반환값도 없으며 void도 아니다.
  • 모든 필드를 0, false, null로 초기화
class Account{
    Account(){
        ...
    }
}

c. 재정의 생성자 (매개변수가 있는 생성자)

  • 사용자가 임의로 다시 만들어 놓은 생성자
class Account {
    //1. 멤버변수
    String accID; //계좌번호
    String name; //이름
    int balance; // 잔액

    //2.1 기본생성자
    Account(){

    }

    //2.2 매개변수가 있는 생성자
    Account(String p_accId, String p_name, int p_balance){
        accID = p_accId;
        name = p_name;
        balance = p_balance;
    }

    //3. 메서드
    public void deposit(int money) {
        balance += money;
    }
    public void showInfo() {
        System.out.println("계좌번호 : "+accID);
        System.out.println("이름 : "+name);
        System.out.println("잔액 : "+balance);
    }
    public void withdraw(int money) {
        balance-=money;
    }

}
public class AccountTest{
    public static void main(String[] args) {
        Account acc2 = new Account(); // 기본생성자 호출

        //멤버변수 사용
        acc2.accID = "111-111-1111";
        acc2.name="홍길동";
        acc2.balance=100000;

        //메서드 사용
        acc2.withdraw(30000);
        acc2.showInfo();


        //매개변수 있는 생성자 이용
        Account acc = new Account("1000-1010-10", "김길동",20000);
        acc.showInfo();
    }
}

4. 접근 제한자

a. 접근제한자란

  • 멤버나 클래스에 사용되어, 해당하는 멤버나 클래스를 외부에서 접근하지 못하도록 제한
  • 은닉성 : 객체는 필요한 것만 외부에 노출, 그외의 것은 은닉
  • 클래스 내부의 멤버를 노출하거나 숨길 때 사용
  • 클래스, 멤버변수, 메서드, 생성자에 사용

    private : 같은 클래스 내에서만 접근 가능
    default(생략형) : 같은 패키지 안에 있는 클래스에서만 접근 가능
    protected : 다른 패키지여도 상속관계, 자식클래스는 접근 가능
    public : 어디서나 접근 가능

b. 요소별 사용가능 접근제한자

  • 클래스 : public, default
  • 메서드 : public, protected, default, private
  • 멤버변수 : public, protected, default, private
  • 지역변수 : 없음

c. 변수, 메서드 접근제한자

  • 클래스 : 일반적으로 멤버변수는 숨기고(private), 메서드는 노출(public)

    • 멤버변수 private : 클래스 외부 접근 불가, 내부에서만 접근 가능
    • 메서드 public : 외부에서도 접근 가능
  • 클래스의 멤버변수에 값을 입력하고 싶을 때 메서드에 매개변수를 넘기는 방법 이용

    • 멤버변수는 private으로 지정, 메서드를 public으로
package thisPackage;

class privateVar{
    private int x = 10;
    int y=20;
    protected int z = 30;
    public int n = 40;
    public void showInfo() {
        System.out.println("x="+x);
        System.out.println("y="+y);
        System.out.println("z="+z);
        System.out.println("n="+n);
    }
}

public class PrivateTest {

    public static void main(String[] args) {
        privateVar a = new privateVar();
        a.showInfo();
        // a.x = 20; => the field privateVar.x is not visible
        // 멤버변수가 private이라 변경 불가능

        a.y=1; // 접근가능 default
        a.z=1; // 접근가능 protected
        a.n=1; // 접근가능 public

        otherPackage.PrivateVar2 b = new otherPackage.PrivateVar2(); // 다른패키지 클래스
        //b.x = 20; //접근불가 private
        //b.y=1; // 접근불가 default
        //b.z=1; // 접근불가 protected
        b.n=1; // 접근가능 public
    }

}

d. 클래스 접근제한자

  • public 클래스 / 어디서나 접근 가능
  • default 클래스 / 같은 패키지 내에서만 접근 가능
package thisPackage;

public class classTest {

    public static void main(String[] args) {

        //otherPackage.defaultClass dc = new otherPackage.defaultClass();
        //other패키지의 default클래스는 접근이 불가능해 error

        otherPackage.publicClass pc = new otherPackage.publicClass();
        //other패키지의 public클래스는 접근 가능
    }

}

e. getter/setter

  • private으로 보호되는 멤버변수의 값을 가져오거나 변경하기 위해 사용
  • ger(), set() 메서드
  • 멤버변수 하나당 한쌍의 getter, setter 메서드 필요

    pirvate int a;
    public void seta(int p_a){
    a = p_a;
    }
    public int geta(){
    return a;
    }

class Man2{
    private int age;
    int height;

    public int getAge() { // 값을 읽어오기 위해 사용
        return age;
    }
    public void setAge(int p_age) { // 값을 저장하기 위해 사용
        if(p_age<1) {
            p_age = 1;

        }else if(p_age>100) {
            p_age = 100;
        }
        age = p_age;
    }
}

public class ManTest2 {

    public static void main(String[] args) {
        Man2 m = new Man2();
        m.height = 1800;
        //m.age=20; error
        m.setAge(1800); // setter 이용 값 저장

        System.out.println("height = "+m.height);
        //System.out.println("age = " + m.age); error 접근불가
        System.out.println("age = "+m.getAge()); // getter 이용 값 읽기

    }

}
  • private으로 보호받지 못하는 height는 1800이라는 값이 그대로 들어가버린다.
  • private으로 보호받는 age는 범위 지정을 통해 잘못된 값을 걸러낼 수 있다.

5. this

  • 자기참조 변수
  • 인스턴스의 주소가 저장되어있다.
  • 객체를 메모리에 로드했을 때, 로드된 자기 자신을 나타낼 때 사용
  • 클래스 내부에서 자기 자신의 클래스를 지칭
  • 클래스를 디자인 할 때 사용, 객체 생성후 사용하지 않는다
    • 클래스 안에서만 사용가능, 밖에서는 쓸 수 없다.
    • static 메서드에서는 사용할 수 없다.
class thistest{
    private int num = 10;
    public void set(int num){
        this.num = num; //this를 통해 멤버변수를 구분하기에 같은 변수이름을 사용할 수 있다.
    }
}

6. 클래스와 배열

  • int 배열에는 int를, String배열에는 String을 넣는다.
  • 객체 또한 배열에 넣을 수 있다.
//변수에 값 넣기
int a = 10; // int값을 갖는 a 변수에 10을 넣는다
String s = "java"; // String 값을 갖는 s 변수에 java를 넣는다
Account acc = new Account(); // 객체생성 또한 Account클래스를 갖는 acc 참조변수에 객체를 넣는 것

//배열에 값 넣기
int[] a = new int[2] // int배열 a 생성
a[0] = 0; // a배열 0번인덱스 값 0을 넣는다
a[1] = 1; // a배열 1번인덱스 값 0을 넣는다

Account[] accArr = new Account[2]; // account 클래스 배열 accArr 생성
accArr[0] = new Account("111-111", 10000); // accArr클래스 배열 0번 인덱스 객체를 넣는다
accArr[1] = new Account("222-222", 2000); // accArr클래스 배열 1번 인덱스 객체를 넣는다
  • 객체생성 후 참조변수를 이용하는 것과 마찬가지로 배열을 이용할 수 있다.
    Account[] accArr = new Account[2];
    accArr[0] = new Account("111-111", 10000);
    accArr[1] = new Account("222-222", 2000);
    

accArr[0].display(); //0번인덱스에 저장된 객체의 메서드 이용

for(int i=0; i<accArr.length;i++){
accArr[i].display();
} // for문 이용

for(Account acc : accArr) {
acc.display();
} // 확장for


***

## 7. 기본 매개변수와 참조형 매개변수
- 기본형 매개변수 (call by value)
    - 변수의 값을 읽기만 할 수 있다
    - 매개변수가 기본자료형, 값이 전달
    - 메서드에서 매개변수의 값을 변경해도 호출한 곳에서는 변경의 영향을 받지 않는다.
- 참조형 매개변수 (call by reference)
    - 변수의 값을 읽고 변경할 수 있다
    - 매개변수가 참조형, 주소가 전달됨
    - 메서드에서 매개변수의 값을 변경하면 호출한 곳에서도 변경의 영향을 받는다.
728x90
반응형