Java

새싹체험_java_1016

coolcode 2022. 10. 17. 10:29

1016
메서드 :: 객체의 기능 역할

public void run();
public void walk();


소스파일의 이름은 public class 이름과 일치해야함 
하나의 소스파일에는 하나의 public class 만 있어야 함 
> 보통 하나의 소스파일에는 하나의 클래스만 작성하는 것이 좋음

// 클래스 안에 구성 멤버 :: 필드 생성자 메서드 
// 필드란 객체의 속성을 나타냄
// class에 선언된 변수를 필드라고 함

class Person{
   String name;
   int age;


   // 생성자 (객체를 생성할 때 초기화 역할)
   // 생성자는 class 이름과 같은 이름이다
   public Person() {};
   
}

Person person =  new Person();
// class타입 class변수 = new 생성자;

필드 :: 클래스 전역에서 사용가능한 전역변수
지역변수 :: 해당 메서드 지역 내에서만 사용 가능한 지역변수

패키지 파일 :: 소스파일과 바이트 파일을 관리해주는 폴더 
패키지 안에 패키지 폴더 만들 수 있음 

// 필드 field : class에 선언된 변수(멤버변수)
   // 위의 '필드'랑, '메소드에 선언된 변수'와는 틀리다
   // class에 선언된 변수 > 전역변수/ method에 선언된 변수 > 지역변수
   // 선언과 동시에 초기화하는 것은 가능하나 
   // 클래스 블록 안에서 선언과 초기화를 따로 할 수 없고 오직 멤버 선언만 해줌 

   public void study() {
      String place = "도서관";
      int time = 2;
      // 지역변수는 메모리의 스택 영역에 저장됨
      // 스택 영역은 메소드의 호출과 함께 할당(메모리 영역에 저장됨)되며 
      // 메소드의 호출이 완료되면 소멸됨(메모리 영역에서 사라짐)
      System.out.println("공부 장소 : " + place );
      System.out.println("공부 시간 : " + time );
   }

 

public class Ex01 {
   public static void main(String[] args) {
      new Student().study(); // Student 클래스로 부터 객체 생성 후 멤버 메서드 호출
      // 객체 사용 > 객체이름.필드
         
   }

class Car {
   String company = "현대자동차";
   String model = "그랜져";
   String color = "검정";
   int maxSpeed = 250;
   int speed;
   
}

public class Ex02 {
   public static void main(String[] args) {
      // car class 로 부터 car 객체 생성하기
      // 생성된 객체 사용하기
      
      Car car = new Car();
      System.out.println(car.color); 
      System.out.println(car.company); 
      System.out.println(car.maxSpeed); 
      System.out.println(car.model); 
      System.out.println(car.speed);
   }
}


class Car2{
   String color;
   int speed;

   // 메서드를 통해서 필드의 값을 가져오고 세팅함
   public String getColor() {
      return color;
   }
   public void setColor(String color) {
      this.color = color;
   }  // 자기 자신 객체의 참조 변수 this를 통해 필드 접근
   public int getSpeed() {
      return speed;
   }
   public void setSpeed(int speed) {
      this.speed = speed;
   }
}

public class Ex03 {
   public static void main(String[] args) {
      Car2 car2 = new Car2();
      car2.color = "red";
      car2.speed = 60;
      
      System.out.println("색상은 :: " + car2.color);
      System.out.println("스피드는 :: " + car2.speed);
      
      car2.setColor("yellow");
      System.out.println("변경된 색상은 :: " + car2.getColor());
   }
}



OOP프로그래밍에서는 객체 필드를 직접적으로 사용하기 보다는 메서드를 통해서 사용함
> 외부에서 마음대로 필드를 변경할 경우 객체의 무결성이 깨질 수 있기 때문 
이러한 문제를 막기 위해 외부에서 필드를 직접 접근할 수 없고 메서드를 통해서 필드에 접근하게 하는 것

매개변수와 this 
매개변수 이름은 보통 초기화시킬 필드 이름과 동일한 이름을 사용함
메서드 안에서 매개변수의 우선순위가 높기 때문에 메서드 내부에서는 해당 필드에 접근x
이 경우 필드 앞에 'this.'를 붙이면 됨 >>> 'this.필드'는 this라는 참조 변수로 필드를 사용하는 것

getter/setter 
>> 외부에서 필드 데이터를 읽을때도 메서드로 필드값을 검증한 후 필드값을 외부로 전달하면 됨
클래스를 선언할 때 필드를 private으로 선언하고 필드에 대한 setter/getter 메서드를 통해 필드를 사용함
 
private 접근제한자 :: 필드를 바로 접근하지 못하도록 하기 위함
> 메서드를 통해 값을 세팅하고 값을 얻는 방법 밖에 없음 

// 필드 검증
public int getSpeed() {
   if(this.speed < 50) {
      setSpeed(50);
   }
   return speed;
}
public void setSpeed(int speed) {
   if(speed > 200) {
      return;
   }
   this.speed = speed;
}

// 필드 검증 후 확인
Car3 car3 = new Car3();
   car3.setSpeed(233);
   System.out.println(car3.getSpeed());