day08 (가변 매개변수,

2023. 12. 20. 09:14자바 기초 및 세팅

package day08.acces1;

public class Student {
	private int grade;
	int calssNum; //접근 제어자가 default
	public int num;
	private String name;
	
	public int getGrade() {
		return grade;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
	public int getCalssNum() {
		return calssNum;
	}
	public void setCalssNum(int calssNum) {
		this.calssNum = calssNum;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
}​
메서드
(접근제어자) 리턴타입 메서드명(매개변수){
	//구현;
}

가변 매개변수

  • 매개변수의 개수가 미정인 경우.
  • …을 이용
  • 같은 자료형인 경우 사용
  • 가변 매개변수는 배열이 됨. (메소드 안에서 배열처럼 취급)

int sum(int a, int b){}

int sum(int a, int b, int c){}

  • 위처럼 여러 정수를 더하기 위해 계속 메서드 오버라이딩하는것보다 다음처럼 작성하면 개수의 제한이 사라짐.

표현법

int sum(int … nums){
	int sum = 0;
	for(int tmp : nums){
		sum += tmp;
	}
return sum;
}

 

 

메서드 오버로딩(매우 중요)

동일한 이름의 메소드가 여러개인 경우를 메서드 오버로딩이라고 함.

매개변수가 다른데 기능은 같은 경우 메서드 오버로딩을 지원하지 않으면 같은 기능에서 이름만 다른 메서드가 여러개 만들어짐

조건( 결론 : 매개변수가 다름)

  1. 매개변수의 개수가 다름
  2. 매개변수의 타입이 다름

예:

System.out.println(1);//printlnInt

System.out.println(“1”);//printlnString

 

오버로딩의 예

package day08;

public class MethodOverloadingEx1 {

	public static void main(String[] args) {
		
		System.out.println(sum(1, 2));
		System.out.println(sum(1.2, 2.3));

	}
	
	// 두 정수의 합을 알려주는 메서드
	public static int sum(int num1, int num2) {
		return num1 + num2;
	}
	
	//두 실수의 합을 알려주는 메서드
	public static double sum(double num1, double num2) {
		return num1 + num2;
	}
	
	// 아래 메서드는 1번 메서드와 매개변수의 개수도 같고 자료형도 같기 때문에 메서드 오버로딩X
//	public static int sum(int num1, int num2) {
//		return num1 + num2;
//	}
	
	public static int sum(int num1, int num2, int num3) {
		return num1 + num2 + num3;
	}
}

 

 

객체 생성하기 = 인스턴스 생성하기

  • 클래스명 객체명 = new 클래스명();
  • Student 클래스를 이용해 학생 객체를 생성하려고 한다.
  • Student std1 = new Student();
  • new : 객체를 생성하는 예약어
  • Student() : 생성된 객체를 초기화하는 예약어.
  • std1은 인스턴스, 객체라고 하며 참조변수이다.

클래스, 객체, 인스턴스

  • 객체 : 의사나 행위가 미치는 대상(현실)
  • 클래스 : 객체를 코드로 구현한 것
  • 인스턴스 : 클래스를 이용해 만든 것. 객체라고 함.

스택 메모리 vs 힙 메모리

스택 

  • 메서드 호출과 관련된 정보를 저장하는 영역
  • 메서드 호출 시 매개변수, 지역변수, 복귀 주소 등이 저장

  • 동적으로 할당된 객체들이 저장되는 영역(new 키워드)
  • 확장 축소 가능
  • 사용되지 않는 객체는 GC(가비지 컬렉터)에 의해 제거 
  • 객체의 인스턴스 변수(멤버변수), 배열 등

생성자

인스턴스(객체)의 생성할 때 멤버변수나 상수를 초기화 하는 것

편리하다 => 멤버를 한번에 쉽게 초기화 할 수 있어서

메서드와 비슷하게 생김

  • 이름이 클래스 이름과 같다.
  • 메서드와 비교했을 때 리턴타입이 없음. =>void 아니고 생략 
  • 생성자
(접근제어자) 클래스명 (매개변수)
     //초기화;
}
  • 메서드
(접근제어자) 리턴타입 메서드명(매개변수){
	//구현;
}

 

디폴트 생성자(기본 생성자)

  • 매개변수가 없는 생성자
  • 클래스의 생성자가 하나도 없을 때 자동으로 추가
  • 기본 생성자가 없는 경우도 있음(예: Scanner)

 

생성자 오버로드

  • 여러 종류의 생성자를 만들 수 있다.
  • 클래스에 생성자가 2개 이상인 경우
  • 다양한 경우를 대비해서 초기화하기 위해

생성자 오버로드 예제

package day08;

public class MethodOverloadingEx1 {

	public static void main(String[] args) {
		
		System.out.println(sum(1, 2));
		System.out.println(sum(1.2, 2.3));

	}
	
	// 두 정수의 합을 알려주는 메서드
	public static int sum(int num1, int num2) {
		return num1 + num2;
	}
	
	//두 실수의 합을 알려주는 메서드
	public static double sum(double num1, double num2) {
		return num1 + num2;
	}
	
	// 아래 메서드는 1번 메서드와 매개변수의 개수도 같고 자료형도 같기 때문에 메서드 오버로딩X
//	public static int sum(int num1, int num2) {
//		return num1 + num2;
//	}
	
	public static int sum(int num1, int num2, int num3) {
		return num1 + num2 + num3;
	}
}

접근제어자

클래스의 멤버변수, 메서드, 생성자에 대한 접근을 지정하는 예약어

private 자신 클래스
(default) 자신 클래스 + 같은 패키지
protected 자신 클래스 + 같은 패키지 + 자식 클래스
public 모두

 

  • 일반적으로 멤버 변수들은 private
    • getter/setter를 이용하여 접근
  • 일반적으로 메서드는 public
  • 일반적으로 생성자는 public. 단, 싱글톤을 만들때는 private로
  • 클래스에 public이 붙으려면, 클래스 이름과 파일명이 같아야한다.

정보은닉

  • 클래스 내부에서 사용할 변수나 메서드를 private으로 선언해서 외부에서 접근하지 못하도록 막는 것 
  • 일반적으로 멤버 변수는 private으로 선언
  • 일반적으로 메서드는 public으로 선언
  • 일반적으로 생성자는 public. 싱글톤의 경우 private

접근 제어자, 정보 은닉 예제

package day08.acces1;

public class AccessModifierEx1 {

	public static void main(String[] args) {
		Student std = new Student();
		//std.grade = 1;//grade의 접근제어자가 private이어서 같은 패키지에 있는 클래스에서 사용 X
		//grade가 private이어서 grade를 수정하기 위해 setter를 이용하여 수정
		std.setGrade(1);
		std.classNum = 2; //classNum의 접근제어자가 default이어서 같은 패키지에 있는 클래스에서 사용 O
		std.num = 3;//num의 접근제어자가 public이어서 사용 O
		System.out.println(std.getGrade() + "학년");
	}

}

 

package day08.acces1;

public class Student {
	private int grade;
	int calssNum; //접근 제어자가 default
	public int num;
	private String name;
	
	public int getGrade() {
		return grade;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
	public int getCalssNum() {
		return calssNum;
	}
	public void setCalssNum(int calssNum) {
		this.calssNum = calssNum;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
}

 

 

package day08.acces2;

import day08.acces1.Student;

public class AccessModifierEx2 {

	public static void main(String[] args) {
    
		Student std = new Student();
		//std.grade = 1;//grade의 접근제어자가 private이어서 다른 패키지에 있는 클래스에서 사용 X
		//std.calssNum = 1; //classNum의 접근제어자가 default이어서 다른 패키지에 있는 클래스에서 사용 X
		std.num = 1;//num의 접근제어자가 public이어서 사용 O
        
	}

}

 

 

위와 같이 패키지를 새로 만들어서 앞 과정처럼 멤버변수에 접근을 하려고 하면 에러가 뜬다 이유는

멤버 변수가 private로 선언 되었기 때문이다. 

 

앞 설명에서 일반적으로 멤버변수는 private로 선언된다고 했는데 어떻게 접근을 하면 될까?

2번째 코드 블럭에 있는 코드 블럭처럼 getter/setter를 만들어 접근을 하면 된다.

'자바 기초 및 세팅' 카테고리의 다른 글

9일차 (나혼자 사용하는 게시판 만들기) 자바  (0) 2023.12.21
9일차 - 자바란?  (0) 2023.12.20
day08 클래스와 객체  (0) 2023.12.19
day 07(예제)  (1) 2023.12.18
day07 (클래스와 객체, 함수)  (0) 2023.12.18