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;
}
메서드 오버로딩(매우 중요)
동일한 이름의 메소드가 여러개인 경우를 메서드 오버로딩이라고 함.
매개변수가 다른데 기능은 같은 경우 메서드 오버로딩을 지원하지 않으면 같은 기능에서 이름만 다른 메서드가 여러개 만들어짐
조건( 결론 : 매개변수가 다름)
- 매개변수의 개수가 다름
- 매개변수의 타입이 다름
예:
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 |