Constructor(생성자)

  • 생성자 메서드의 이름은 클래스의 이름과 동일해야 함
  • 생성자 메서드는 리턴 값을 가지지 않음
  • 생성자 메서드는 인스턴스가 생성될 때 자동으로 호출됨
  • 그래서 사용자 마음대로 호출 시기를 지정할 수 없음
  • 그 외의 모든 규칙은 일반 메서드와 동일함(매개 변수, 오버로딩 등)
  • 매개 변수를 받는 생성자가 생기면 default 생성자는 사라짐
    1. 부모 클래스에 default 생성자를 작성함
    2. 자식 클래스에 매개 변수를 받는 생성자를 작성

 

▽ 예제 코드 1 ▽

public class Tv {

	private int channel;
	private int volume;

	public Tv() {}
	public Tv(int channel, int volume) {
		this.channel = channel;
		this.volume = volume;
	}
	
	public int getChannel() {
		return channel;
	}
	
	public void setChannel(int channel) {
		this.channel = channel;
	}
	public int getVolume() {
		return volume;
	}
	public void setVolume(int volume) {
		this.volume = volume;
	}
	
}

 

 

▽ 예제 코드 2 ▽

		Tv tv = new Tv(5, 10); // 생성자 메서드 콜
		
		// Heap에 변수를 만들면 초기값은 0임
		// Stack에 들어간 변수의 초기값은 쓰레기 값이 들어감
		System.out.println((tv.getChannel()));
		tv.setChannel(5);
		tv.setVolume(10);
		
		System.out.println(tv.getChannel());
		System.out.println(tv.getVolume());

 

 

 

 

 

 

정보 은닉

  • 접근 제한자 이용
  • 장점
    1. 개발자의 의도대로 사용자가 사용하게끔 함(개발 안정성)
    2. 외부에 공개하면 안 되는 class를 숨길 수 있음(사용자 편리성)

 

접근 제한자

  • 접근 범위 순위
    • public: 모든 클래스에서 쓸 수 있음
    • protected: package와 동일, 같은 패키지 안에 있는 클래스에서 사용 가능, but, 다른 패키지에서 상속하면 사용 가능, 어떤 메서드를 오버라이딩 할 것을 추천해 줄 때도 사용
    • package: 클래스를 하나의 폴더처럼 분류할 때 쓰임, 폴더명은 보통 레벨 3으로 나눠서 이름에 씀(집단이름.프로젝트.분류), 프로젝트 폴더에 자동으로 인식 및 분류해서 폴더 생성, 같은 패키지 안에 있는 클래스에서 사용 가능, 외부 클래스에서는 private으로 바뀜
    • private: 자기 내부 클래스에서만 있음
    • 다른 클래스의 private 멤버를 사용하는 방법: member field를 private으로 막아 놓고, private field를 사용하는 method를 제공해 줌

<package 사용 예시>

 

 

 

멤버 변수

  • Class 안에 있는 변수, instance가 생성될 때 만들어짐(new)
  • instance는 모든 reference가 사라질 때 같이 사라짐

 

지역 변수

  • method 안에 있는 변수, method가 실행될 때 만들어짐
  • method의 실행이 끝나면 자동으로 사라짐

 

 

 

 

객체 지향 프로그램

  • 현실을 표방하는 개발 기법
  • 객체: 속성 + 기능
  • 순서
    1. 개발 대상의 선택
    2. 개발 대상을 분석
      • 기능과 속성을 명세(ex. 모니터)
      • 속성: 색깔 / 가격 / 브랜드 등등
      • 기능: 전원 켜기, 끄기 / 밝기 조정 등등
    3. 개발 대상 설계도 작성(클래스)

 

 

 

클래스

  • 설계도 목적으로 쓰임
  • 시작점인 main method를 가지는 class는 딱 하나여야 함
  • 기능은 method로 명시
  • 참조 자료형이기 때문에 Heap에 저장하고, new로 선언함
  • new를 통해 실체화된 instance(객체)가 Heap에 저장됨
  • Instance는 모든 reference가 사라질 때 같이 사라짐
  • 클래스의 method는 Ram의 txt에 저장되고, 메서드의 매개 변수는 stack에 저장됨
  • 객체. : instance 접근 연산자, 인스턴스 주소를 찾아가라는 명령

 

▽ 예제 코드 1 ▽

public class Exam_04 {
	
	public static void main(String[] args) {
		
		Monitor mon = new Monitor(); // 주소형
		// new를 통해 실체화된 instance(객체)가 Heap에 저장됨
		// class의 method는 Ram의 txt에 저장됨
		// 그 method의 지역 변수는 stack에 저장됨
		
		// mon. -> instance 접근 연산자(mon의 인스턴스 주소를 찾아가라는 명령)
		mon.powerOn();
		
		mon.setPrice(1000);
		System.out.println(mon.getPrice());
		
		mon.setColor("blue");
		System.out.println(mon.getColor());
		
		System.out.println(mon);
		System.out.println(mon.getThis()); // mon 자기 자신의 instance의 주소를 get함
		
		Tv tv = new Tv();

	}

}

 

 

 

 

 

Call by reference

  • 참조에 의한 호출
  • 주소값을 전달

 

Call by value

  • 값에 의한 호출
  • 값을 전달

 

Call by name

  • 이름에 의한 호출
  • Ex) func();

▽ 예제 코드 1 ▽

public class Exam_01 {
	
	public static void method(int[] arr) {
		
		arr[2] = 100; 
		
	}
	
	public static void func() {}
	
	public static void func1(int num) {}
	
	public static void func2(int[] nums) {}
	
	public static int test(int a) {
		return 50;
	}
	
	public static void main(String[] args) {
		
		int[] arr = new int[] {1, 2, 3, 4, 5};
		method(arr); // Heap에 있는 arr 값의 주소값이 전달됨
		System.out.println(arr[2]); // 참조에 의한 호출 call by reference
		func(); // 이름에 의한 호출 call by name
		func1(100); // 값에 의한 호출 call by value
		func2(new int[] {1, 2, 3}); // call by reference
		
		int a = 0;
		a = test(a);
		System.out.println(a);
		
	}
	
}

 

 

 

 

 

가변 인자 매개 변수

  • 매개 변수에 몇 개의 개수가 들어갈지 모를 때 사용
  • 메서드 안에서는 배열처럼 사용하면 됨

▽ 예제 코드 2 ▽

public class Exam_02 {
	
	public static void func(String... str) { // 가변 인자 매개 변수
		
		// 가변 인자 쓸 때는 배열처럼 사용하면 됨
		for(int i = 0; i < str.length ; i++)
			System.out.println(str[i]);
		
	}
	public static void main(String[] args) {
		
		func("Hello", "world");
		
	}

}

 

 

 

 

 

Method Overloading

  • 메서드의 이름이 같아도 매개 변수의 종류 또는 개수가 다르면 다른 메서드로 인식함
  • 매개 변수 O, 리턴 타입 X

▽ 예제 코드 3 ▽

public class Exam_03 {
	
	// Method Overloading
	// 메서드의 이름이 같아도 매개 변수의 종류 또는 개수가 다르면 다른 메서드로 인식함
	// 매개 변수 O, 리턴 타입은 X
	public static void func() {System.out.println("A");}
	public static void func(int num) {System.out.println("B");}
	public static void func(int num1, int num2) {System.out.println("C");}
	public static void func(double d) {System.out.println("D");}
		
	public static void main(String[] args) {
		
		func();
		func(10);
		func(10, 20);
		func(1.0);
		
	}
}

 

 

 

 

 

 

 

메서드

  1. 매개 변수(인자)를 전달받고, 작업 수행 후, 결과를 반환함
  2. 기능별로 분할 관리하여 가독성을 높임
  3. 코드 재사용으로 개발 및 유지 보수 시간을 단축시킴
  4. 실행 코드 제외한 골격을 prototype이라고 함
  5. 메서드마다 스택에서 공간을 따로 씀
  6. 메서드가 call 될 때 매개 변수도 stack에 만들어짐
  7. 메서드가 끝나면 매개 변수 메모리는 청소됨

 

String 자료형 메서드 종류

 

str.charAt()

  • String 값에서 해당 index에 있는 문자 값 반환

str.contains(String)

  • 해당 String 값을 포함하면 true 값을 반환

str.contains(String)

  • 해당 String 값을 포함하면 true 값을 반환

str.contains(String)

  • 해당 String 값을 포함하면 true 값을 반환

+ Recent posts