티스토리 뷰

클래스 내부 구성 요소

package
import
class

public class A{
    필드(멤버 변수)
    메소드
    생성자
    내부 클래스
}

 

1. 필드

-객체의 속성값 지정

-클래스 소속 변수 : Heap 메모리에 저장.

cf) 지역변수 : 메소드에 포함된 변수. Stack 저장. 메소드가 호출될 때만 생성, 메소드 종료시 Stack 메모리에서 삭제

근데 초기화하지 않으면 쓰레기값이 남아있으므로 지역변수는 초기화해준다.

매개변수 - 지역변수, 메소드의 값을 받아오는 것.

Class A{
   int m = 1;  //필드 변수
   int n = 2;
   
   void work1(){
       int k =5; // 지역 변수(메서드 내에서만 통용되는)
       System.out.println(k);
       work2(3);
   }
   
   void work2(int i){
       int j=4; //지역 변수
       System.out.println(i+j);
   }
}

└Heap 공간에 메모리가 있어야 메소드가 찾아가 실행할 수 있음. 객체 생성해야 한다는 뜻.

 

(1) 필드 값 세팅 규칙

규칙을 알면 이름으로 알 수 있음, 세팅하고 있음을.

Employee e1 = new Employee(); //필드 초기화 안 함. //Employee에 속한 객체 e1
e1.setEmpno(1);  //필드 값 세팅하고 있음을 이름으로만 알 수 있음.
e1.setEname("홍길동");
e1.setDname("영업부");
e1.setPosition("과장");
e1.setSal(500);

2. 메소드

메소드 이름은 변수 작성 규칙과 동일

public static int sum(int a, int b){
    //메소드 내용 - 실행문
}
접근지정자   리턴(반환) 타입 메서드 이름 입력 매개변수
public static int sum (int a, int b);
생략 가능 생략 가능 return | void 변수 작성
규칙 동일
 

└static : 객체 생성없이 클래스 이름으로 메소드를 부를 수 있음. 생량 가능

└리턴(반환) 타입 : 자료형에 맞게 반환. return을 쓰지 않으려면 void

(*void : 함수 호출한 곳에 돌려줄 값이 없다. 리턴(반환)값 없음. 함수 종료하고 끝)

//리턴타입 void + 매개변수 없음 : 리턴 안 함
void print () {
    System.out.println("안녕");
}

//리턴타입 int + 매개변수 없음
int data () {
    return 3;
}

//리턴타입 double + 매개변수 2개
double sum (int a, double b) {
    return a+b;
}

└return 타입이 void인 경우에도 메소드 내에 return 사용 가능. 단, 값의 리턴없이 return만 사용(메소드 종료)

 

 

(1) 메소드 오버로딩(MethodOverloading)

메소드 이름은 같은매개변수가 다른 것. 변수 이름은 상관없음.

_예시) 메소드 이름이 전부 pirnt지만 매개변수가 각각 다름.

public class MethodOverloadingClass {
	void print() {
		System.out.println("no data");
	}
	void print(int a) {
		System.out.println("int data : "+a);
	}
	//오류 : 리턴타입은 시그너처 포함 x. 위의 메소드와 동일 메소드로 간주. 오류 발생.
//	int print(int b) {
//		System.out.println("int data : "+b);
//		return b;
//	}
	void print(double a) {
		System.out.println("double data : "+a);
	}
	void print(int a, int b) {
		System.out.println("data a : " + a + "data b :" + b);
	}
}
public class MethodOverloadingTest {
    public static void main(String[] args) {
        MethodOverloadingClass obj = new MethodOverloadingClass(); // 객체 생성
        //점(.)으로 연결해 호출
        //메소드 이름 같아도 매개변수 종류가 다르니 다른 것 호출.
        obj.print();
        obj.print(10);
        obj.print(10.5);
        obj.print(1, 2);
        System.out.println("-----------");
	}
}

└리턴 타입은 시그너처에 포함되지 않아 리턴 타입만 다를 경우 메소드가 2개 정의된 것으로 보아 오류 발생.

//리턴 타입만 다를 경우 오류남.
public static void print(int a){...}
public static int print(int a){...}
print(3);

-가변 길이 매개변수

같은 자료형 데이터가 여러 개일 때

public class MethodOverloadingClass { //생성자
	void method1(int...values) {
		for(int i:values) { //values에 있는 값을 i에 할당.
			System.out.print(i+ " ");
		}
		System.out.println("End");
	}
}
public class MethodOverloadingTest {
    public static void main(String[] args) {
        MethodOverloadingClass obj = new MethodOverloadingClass();
        //같은 자료형 데이터가 여러 개일 때.
        obj.method1(1);
        obj.method1(11, 3, 5);
        obj.method1(5, 6, 8, 10);
        obj.method1();
    }
}

 

 


3. 생성자

객체 생성 및 필드 초기화

멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할.

package constructor;
public class Person {
    String name;
    float height;
    float weight;
    
    public Person(){ //default }
    
    public Persong(String name){  //1.
        tihs.name = name;
    }
}

└1 : 사람 이름을 매개변수로 입력받아 Person 클래스 생성하는 생성자

 

클래스 이름과 동일. 리턴 타입(return | void) 존재하지 않음.

생성자를 정의하지 않은 경우, 컴파일러가 기본생성자(default) 추가 - 입력 매개변수가 없는 생성자

생성자를 하나 이상 만들기 시작했다면 디폴트 생성자를 만들어주지 않으므로 직접 만들어야 함.

애초에 만들 때 디폴트 생성자를 만들어!

public class MethodOverloadingClass {
    public MethodOverloadingClass() { //디폴트값 생성자
    //상속할 때 많이 사용
	}
        
    public MethodOverloadingClass(int a) {  //생성자 오버로딩
    }
    
    void print() {
        System.out.println("no data");
    }
    void print(int a) {
        System.out.println("int data : "+a);
    }
}

-생성자 오버로딩 : 생성자 이름은 같은데 입력 매개변수가 다름.

 

-실제 클래스 만들 때,

메소드 앞에는 public, 필드 변수 앞에는 private 붙임.

 

(2) 접근자, 설정자 메소드 getter, setter

다른 클래스에서 private 필드에 접근 가능하도록 하는 것. 필드변수 있는 클래스에 생성? 작성.

-get : 값을 가져올 때,

-set : 값을 설정할 때,

class A{
	priavte String name;
    private int age;
    private float height;
    private float weight;
    
    //default 생성자
    A(){
    }
    
    //접근자(getter)
    public String getName(){
    	return name;
    }
    public int getAge(){
    	return age;
    }
    public float getHeight(){
    	return height;
    }
    public float getWeight(){
    	return weight;
    }
    
    //설정자(setter)
    public void setName(String name){
    	this.name = name;
    }
    public void setAge(int age){
    	this.age = age;
    }
    public void setHeight(int height){
    	this.height = height;
    }
    public void setWeight(){
    	this.weight = weight;
    }
]

 

_실습 예제) Employee

-private : 같은 클래스 내부에서만 사용 가능. 필드명 숨김.

-setter, getter : private 붙은 필드 변수를 다른 클래스에서 사용하려고. public 선언.

 └get : 값을 얻고 싶을 때

 └set : 값을 새로 세팅할 때

 └자동 생성 : 우클릭 > source > generate Getters and Setters

(우클릭 > source > generate Constructor usin fields)

package test0126;
public class Employee { // 생성자 
	private int empno;  //필드 변수
	private String ename;
	private String dname;
	private String position;
	private int sal;
	
	// 1_default
	public Employee(){}
	
	// 2
	public Employee(int empno, String ename, String dname) { //지역변수
		this.empno = empno;
		this.ename = ename;
		this.dname = dname;
	} //this.필드변수  지역변수
	
	// 3
	public Employee(int empno, String ename, String dname, String position, int sal) {
		this.empno = empno;
		this.ename = ename;
		this.dname = dname;
		this.position = position;
		this.sal = sal;
	}
	
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}
	
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	
	public String getPosition() {
		return position;
	}
	public void setPosition(String position) {
		this.position = position;
	}
	
	public int getSal() {
		return sal;
	}
	public void setSal(int sal) {
		this.sal = sal;
	}
	
	public void display() { // 메소드 정의
		System.out.print(empno+" ");
		System.out.print(ename+" ");
		System.out.print(dname+" ");
		System.out.print(position+" ");
		System.out.print(sal+" ");
	}	
}

-객체 생성하는 메인 함수 클래스(다른 파일일 경우)에서 디폴트값 방식 변경 불가능

package test0126;
public class EmployeeTest { //객체 생성 클래스
	public static void main(String[] args) {
		//아래의 방법으로 private 수정 불가능
//		Employee e1 = new Employee();
//		e1.empno = 1;
//		e1.ename = "홍길동";
//		e1.dname = "영업부";
//		e1.position = "과장";
//		e1.sal=500;
		
        Employee e1 = new Employee(); //필드 초기화 안 함.
        e1.setEmpno(1);
		e1.setEname("홍길동");
		e1.setDname("영업부");
		e1.setPosition("과장");
		e1.setSal(500);
		
		Employee e2 = new Employee(2, "홍길수", "총무부");//empno, ename, dname 초기화
		e2.setPosition("대리");
		e2.setSal(400);
		
		Employee e3 = new Employee();
		e3.setEmpno(3);
		e3.setEname("홍길미");
		e3.setDname("홍보부");
		e3.setPosition("사원");
		e3.setSal(300);
		
		e1.display();
		System.out.println();
		e2.display();
		System.out.println();
		e3.display();
	}
}

 


4. this와 this()

-this

인스턴스의 자기 자신. 인스턴스 자신의 주소 반환. 클래스 내 다른 생성자 호출.

public Employee(){}
	
//2
public Employee(int empno, String ename, String dname) { //지역변수
    this.empno = empno;
    this.ename = ename;
    this.dname = dname;
} //this.필드변수  지역변수
	
//3
public Employee(int empno, String ename, String dname, String position, int sal) {
//  this.empno = empno;
//  this.ename = ename;
//  this.dname = dname;
    this(empno, ename, dname); //2번에서 이미 작성된 코드, 이렇게 축약 표현 가능
    this.position = position;
    this.sal = sal;
}

this(); 메소드 : 이미 작성된 코드를 호출. 코드 작성의 효율성.

생성자에서 코드 반복되는 것을 제거. 클래스 생성자에서만 쓸 수 있음. 반드시 첫줄. 그래서 하나씩만 쓸 수 있음.

//생성자 클래스에서
//1
public ThisA() {
    System.out.println("default 생성자");
}
	
//2
public ThisA(int i) {
//  this(); //생성자 안에 생성자 1번 호출. 3개 쓰면 오류. 하나만 써줘야 함.
    this(3,2); //3번 호출. this()는 항상 첫줄. 그래서 하나씩만 호출할 수 있음.
    this.i = i;
		
    System.out.println("second 생성자");
}
	
//3
public ThisA(int i, int j) {
    System.out.println(i+j);
}

'수업 > └Java' 카테고리의 다른 글

[CH7]상속과 다형성  (0) 2022.02.02
[CH06_3]클래스 외부 구성 요소  (0) 2022.01.31
[CH06_1]클래스 기본 문법  (0) 2022.01.31
[CH05_2]참조 자료형 : String  (0) 2022.01.31
[CH05_1]참조 자료형 : 배열(Array)  (0) 2022.01.31
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함