혼자 공부하는 자바 - 6장. 클래스

youngtae·2023년 3월 25일
0

자바 이론

목록 보기
5/12
post-thumbnail

객체지향 프로그래밍

객체

  • 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중, 자신의 속성을 가지고 있으면서 식별 가능한 것
  • 속성(필드)과 동작(메소드)으로 구성
  • 객체는 각각 독립적으로 존재하고, 다른객체와 상호작용하며 동작
    이때, 객체가 다른 객체의 기능을 이용하는것이 메소드 호출
    리턴값 = 객체.메소드(매개값1, 매개값2, …);
    int result = Calcilator.add(10, 20);

  • 객체간의 관계

    • 집합관계: 객체는 하나의 부품, 하나의 완성품에 해당
      ex) 자동차와 부품들의 관계
    • 사용관계: 객체간의 상호작용, 다른객체의 메소드를 호출하여 원하는 결과 얻음
      ex) 사람과 자동차 관계
    • 상속관계: 상위 객체를 기반으로 하위 객체를 생성하는 관계
      ex) 기계와 자동차의 관계
  • 객체와 클래스

    • 객체를 만드는 설계도를 클래스
    • 클래스로부터 만들어진 객체를 인스턴스
  • 클래스 선언

    public class 클래스이름{
    
    }
    • public class: 클래스 선언할 때 사용, 반드시 소문자로 작성
    • public 접근 제한자는 파일이름과 동일한 이름의 클래스 선언에만 붙일 수 있음, 이름이 다른 클래스에 붙이면 컴파일 에러 발생
    • 일반적으로 소스 파일 하나당 하나의 클래스 선언, 2개 이상도 가능하며
      그럴경우 바이트 코드 파일(.class)가 선언한 만큼 생성됨
  • 객체 생성과 클래스 변수

    • 객체 생성: new 연산자 사용, new 클래스();
      클래스 변수 = new 클래스();
      Student s1 = new Student();
      • new 연산자는 힙 영역에 객체 생성 후 객체의 주소를 리턴, 이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체 사용 가능
    • 클래스는 라이브러리용, 실행용으로 구분, 하나의 클래스만 실행용이고
      나머지는 라이브러리 클래스
    • 실행 클래스는 진입점인 main()메소드를 제공
  • 클래스 구성 멤버

    • 필드
      • 객체의 고유 데이터, 상태 정보를 저장하는 곳
      • 선언 형태는 변수와 비슷하지만 변수라고 부르지 않음
      • 필드는 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 계속 존재
    • 생성자
      • new 연산자로 호출되는 중괄호 블록
      • 객체 생성 시 초기화 담당
      • 메소드와 비슷하지만, 클래스 이름으로 되어있고 리턴 타입이 없음
    • 메소드
      • 객체의 동작에 해당하는 중괄호 블록
      • 메소드를 호출하면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행
      • 외부로부터 매개값을 받아 실행에 이용하고, 실행 후 결과 값을 외부로 리턴할 수도 있음

필드

  • 객체의 고유 데이터, 상태 데이터를 저장하는 곳
  • 필드 선언은 클래스 안의 어디서든 존재 가능
  • 생성자와 메소드 블록 내부에서는 불가능, 그 안에서 선언된것은 로컬 변수
  • 초기값이 지정되지 않은 필드는 객체 생성 시 자동으로 초기값으로 설정

  • 필드 사용
    • 클래스 내부의 생성자나 메소드에서 사용할 경우
      필드= 변경할 값;

    • 클래스 외부에서 사용할 경우: 객체를 생성한 뒤 필드사용해야함

      Car myCar = new Car(); //객체 생성
      myCar.speed = 60;  //필드 사용
    • 클래스 필드 선언

      public class Car {
      	//필드
      	String company = "현대자동차";
      	String model = "그랜저";
      	String color = "검정";
      	int maxSpeed = 350;
      	int speed;
      }
    • 외부클래스에서 필드값읽고 변경

      public class CarExample {
      	public static void main(String[] args) {
      		//객체 생성
      		Car myCar = new Car();
      		
      		//필드값 읽기
      		System.out.println("제작회사: " + myCar.company);
      		System.out.println("모델명: " + myCar.model);
      		System.out.println("색상: " + myCar.color);
      		System.out.println("최고 속도: " + myCar.maxSpeed);
      		System.out.println("현재 속도: " + myCar.speed);
      		
      		//필드값 변경
      		myCar.speed = 60;
      		System.out.println("수정된 속도: " + myCar.speed);
      	}
      }
      /*
      제작회사: 현대자동차
      모델명: 그랜저
      색상: 검정
      최고속도: 350
      현재속도: 0
      수정된 속도: 60
      */

생성자

  • new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체 초기화 담당
  • 객체 초기화란 필드를 초기화하거나 메소드를 호출하여 객체를 사용할 준비를 하는 것
  • 생성자를 실행하지 않으면 객체 생성 불가
  • 실행되면 힙 영역에 객체가 생성되고 주소가 리턴
  • 모든 클래스는 반드시 생성자가 존재

  • 만약 클래스 내부에 생성자를 생략했다면 컴파일러는 중괄호 내용이 비어있는 기본 생성자를 바이트 코드에 자동 추가

    • [public] 클래스() { }
      (기본생성자)
  • 생성자 선언

    클래스 (매개변수 선언,) {
          
            //객체 초기화 코드
          
            }
    • 메소드와 비슷한 형식이며 리턴 타입이 없고, 클래스 이름과 동일

    • 내부에는 객체 초기화 코드 작성

      
      public class Car{
      	//생성자
      	Car(String model, String color, int maxSpeed) { }
      }
      
      Car myCar = new Car("그랜저", "검정", 300);
      // 생성자에 매개변수가 선언되어 있으므로
      // Car myCar = new Car(); 기본 생성자 호출 불가
  • 필드 초기화

    • 생성자에서 필드 초기화 가능

      public class Korean {
      	String nation = "대한민국";
      	String name;
      	String ssn;
      
      	public Korean(String n, String s) {
      		name = n;
      		ssn = s;
      	}
      }
      
      //매개변수 초기값 설정
      Korean k1 = new Koewan("박자바", "011225-1234567");
    • 일반적으로 매개변수는 필드와 동일한 이름 사용

    • 그러나 이 경우 필드와 매개변수 이름이 동일하기 때문에 생성자 내부에서 해당 필드에 접근 불가
      -> 동일한 이름의 매개 변수가 사용 우선순위가 높기 때문

    • this.을 앞에 붙여서 해결, this는 자기 자신을 의미

      public Korean(String name, String ssn) {
      	this.name(필드) = name(매개변수);
      	this.ssn = ssn;
      }
  • 생성자 오버로딩

    • 매개변수를 달리하는 생성자를 여러개 선언하는 것

      public class Car {
      	Car() {...} // 1
      	Car(String model) {...} // 2
      	Car(String model, String color) {...} // 3
      	Car(String model, String color, int maxSpeed) {...} // 4
      }
      
      // new 생성자로 호출할 때 
      //제공되는 매개값의 타입과 수에 의해 호출할 생성자 결정
      Car car1 = new Car(); // 1번 호출
      Car car2 = new Car("그랜저"); //2번 호출
      Car car3 = new Car("그랜저", "검정"); // 3번 호출
      Car car4 = new Car("그랜저", "검정", 300);  // 4번 호출
    • 매개변수의 타입과 개수 그리고 선언 순서가 같을 경우 매개변수 이름만 바꾸는 것은 오버로딩이 아님

      Car(String model, String color) {..}
      Car(String color, String model) {..} // 오버로딩 아님
  • 다른 생성자 호출: this()

    • 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드 발생 위험

    • 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선

      클래스( [매개변수, ...]) {
      	this(매개변수, ...,, ...);  // 클래스의 다른 생성자 호출
      	실행문;
      }
    • this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용

      public class Car {
      	//필드
      	String company = "현대자동차";
      	String model;
      	String color;
      	int maxSpeed;
      	
      	//생성자
      	Car() {
      	}
      	
      /*
      변경 전:
      Car(String model, String color) {
      	this.model = model;
      	this.color = "은색";
      	this.maxSpeed = 250;
      }
      */
      	//변경 후
      	Car(String model) {
      		// this를 사용해서 마지막 생성자 
      		// Car(String model, String color, int maxSpeed) 호출
      		this(model, "은색", 250);
      	}
      	
      	Car(String model, String color) {
      		this(model, color, 250);
      	}
      	
      	Car(String model, String color, int maxSpeed) {
      		this.model = model;
      		this.color = color;
      		this.maxSpeed = maxSpeed;
      	}
      }
      public class CarExample {
      	public static void main(String[] args) {
      		Car car1 = new Car();
      		System.out.println("car1.company : " + car1.company);
      		System.out.println();
      		
      		Car car2 = new Car("자가용");
      		System.out.println("car2.company : " + car2.company);
      		System.out.println("car2.model : " + car2.model);
      		System.out.println();
      		
      		Car car3 = new Car("자가용", "빨강");
      		System.out.println("car3.company : " + car3.company);
      		System.out.println("car3.model : " + car3.model);
      		System.out.println("car3.color : " + car3.color);
      		System.out.println();
      		
      		Car car4 = new Car("자가용", "빨강", 200);
      		System.out.println("car4.company : " + car4.company);
      		System.out.println("car4.model : " + car4.model);
      		System.out.println("car4.color : " + car4.color);
      		System.out.println("car4.maxSpeed : " + car4.maxSpeed);
      	}
      }
      /*
      car1.company : 현대자동차
      
      car2.company : 현대자동차
      car2.model : 자가용
      
      car3.company : 현대자동차
      car3.model : 자가용
      car3.color : 빨강
      
      car4.company : 현대자동차
      car4.model : 자가용
      car4.color : 빨강
      car4.maxSpeed : 200
      */
profile
나의 개발기록

0개의 댓글