본문 바로가기

코딩공부일지/수업 review

자바 - 객체지향 프로그래밍1(클래스, 캡슐화, 변수, 생성자, 메서드)

1. 클래스
1) 클래스의 구조

	public class 클래스명(대문자) {

               // 필드부               	
               // 생성자부               
               // 메서드부
     }

2) 클래스의 필드부

[ 필드부 ] (멤버변수, 클래스변수, 인스턴스변수)

1. 작성법: 접근제한자 자료형 필드이름 (변수);
public int name;
2. 필드부 선언된 멤버변수는 클래스 영역 전체에서 유효함 // public int b;
* 메서드 영역 선언된 변수는 메서드 스코프 내에서만 유효 // public void method1() { int a = 0;}


3) 클래스의 접근제한자(access modifier)
: 필드에 접근가능한 범위 제한
- public (+)=> 어디서든 (같은 패키지, 다른패키지 모두) 접근 가능 (예: getter, setter, 생성자)
- protected (#)=> 같은 패키지내 접근가능 , 다른 패키지일시 상속구조인 클래스에서만(자손클래스) 접근가능
- default (~) / package friendly => 오직 같은 패키지에서만 접근가능,자손클래스 접근불가, 생략가능
- private (-) => 오직 해당 클래스 내에서만 접근 가능
- +, #, ~, - : 클래스 다이어그램 표기방법
==>
public > protected > default > private 순으로 접근가능한 범위가 좁아짐


2. 캡슐화
1) 캡슐화가 필요한 이유: 보안을 위해서
- 정보보안 3요소: 기밀성, 무결성(데이터가 외부로부터 변경되지 않았는가), 가용성

- 캡슐화를 하지 않으면 외부로부터 직접 접근이 가능=> 값 변질, 조회를 막지 못하는 문제 발생
- 캡슐화는 정보은닉 기술 중 하나로, 데이터에 대한 "접근제한"을 원칙으로 외부로부터의 직접접근을 막는 방법
- 대신, 간접접근이 가능해야함 (값대입,처리) ===> getter, setter

2) 캡슐화 2단계

[1] 값 숨기기 (private 접근제어자)
[2] 간접적으로 값 접근이 가능하도록 메서드 생성 (getter, setter 메서드)

3) 캡슐화 방법

[1] setter : 데이터를 기록 및 수정하는 기능의 메소드
=> 규칙:
- public 접근제한자 이용 (외부접근이 가능해야 하므로)
- 반환타입은 void => return 반환값 생략가능
- <set필드명 > 으로 명명, 낙타봉 표기법(camelCase) 지킬것
ex) setName, setGender, setAge;
- 모든 필드명(인스턴스 변수)을 작성해야 함
- setter메서드의 지역변수명(매개변수명)은 특별한 사유가 없는 한 멤버변수명(필드이름)과 동일하게 할 것
- 지역변수의 반환 타입은 멤버변수 타입과 맞출 것, 멤버변수에 대입해야하니까!

[2] getter : 데이터를 반환해주는 기능의 메서드
=> 규칙:
- public 접근제한자 이용 (외부접근이 가능해야 하므로)
- 반환타입은 필드명(인스턴스변수)의 반환타입과 일치
=> return반환값 생략불가!
- <get필드명 > 으로 명명, 낙타봉 표기법(camelCase) 지킬것
ex) setName, setGender, setAge;
- 모든 필드명(인스턴스 변수)을 작성해야 함


[3] information class
- get메서드로 값 반환시 멤버변수(필드값)을 하나하나 출력해야함
- get메서드값들의 출력을 용이하게 하기 위해 사용 (String 형 method로 한번에 여러 멤버변수의 값을 출력가능)
- 반환타입은 String 형 (기타 기본형 + String형 => String형이므로)


- 캡슐화를 하지 않을 시 (public class) --> 멤버변수에 직접접근 및 변경이 가능함

public class Student {
  	public String name; 	// 접근제한자가 private로 바뀌는 순간 외부 class 에서 접근이 불가함 
	public char gender;
	public int age;
    
 }
 
 public class Run {
  	public   static        void     main   (String[] args) {
//  접근제한자	 예약어 (생략가능)  반환형              메소드이름   매개변수       변수명
	Student s = new Student();  //객체생성후 임포트
    s.name = "코린";               // 직접접근이 가능함
    s.gender = 'F';					// 직접접근이 가능함
    
    System.out.println(s.name());
    
    
 }

- 캡슐화 시 : 직접접근 불가, getter-setter메서드를 통해 간접접근

public class Student {
  	private String name; 	// 접근제한자가 private로 바뀌는 순간 외부 class 에서 접근이 불가함 
	private char gender;
	private int age;
 
 // 1. setter메서드
 
 	public void setName(String name) {  
    // 추후 인스턴스변수에 값을 대입하기 위해 만드는 메서드이므로 매개변수(파라미터)가 존재
    	this.name = name;   
    // this.필드명 : 메서드의 매개변수명과 멤버변수명이 같을 시 사용. 
    // this.a ==> 해당 클래스의 멤버변수인 'a' (매개변수 x)   
    // this. 을 붙이지 않으면 가까운 변수로 인식 <매개변수 name = 매개변수 name==> a를 a에 대입 
    }
    public void setGender(char gender){   // 세터메서드의 지역변수명, 반환타입은 멤버변수와 일치
 		this.gender = gender;       
 	}
    
    public void setAge (int age){
    	this.age = age;
    } // setter메서드 선언완료
    
    // 2. getter 메서드
    
    public String getName(){   // 메서드 반환타입: 멤버변수(필드)의 데이터타입과 일치
    	return this.name;           // 파라미터 타입, 파라미터명은 따로 입력하지 않아도 됨
        						// 멤버변수 그 자체를 반환받을 뿐, 메서드 인자는 존재하지 않으므로
        						// return문 생략불가~!
                                //this. 생략가능. 동일한 이름의 파라미터 존재 x. 붙이면 더 깔끔 
    }
    public char getGender() {
    	return gender;
    }
   	public int getAge() {
    	return age;
    } // getter메서드 선언완료
   
   // 3. String information클래스 
   //  get메서드로 값 반환시 하나하나 출력해야함 =>get메서드값들의 출력을 용이하게 하기 위해 사용
   // 반환타입은 String 형 (기타 기본형 + String형 => String형이므로)
     public String information() {
     	return name + "님의 나이는 " +age + "살이고 성별은" +gender +"입니다";
       }   
  }
 
 
 public class Run {
  	public static  void  main (String[] args) {
   	
    Student s = new Student();
    
    // s.name = "코린" ===> the field name is not visible 오류!
    // private 멤버변수는 외부에서 접근불가
    
    
    s.setName("코린");
    s.setGender('F');
    s.setAge(29);
    
    System.out.println(s.getGender())   // 나이 출력: 29
    System.out.println(s.information) // information 문자열 출력
    
    }
  }

3. 변수
1) 변수의 구분

멤버변수


인스턴스 변수
(필드)
클래스 영역에 선언

인스턴스마다 별도의 저장공간(변수)을 가지므로 서로 다른 값을 가질 수 있음
인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언

생성: new키워드를 사용하여 객체를 생성하는 순간 메모리 heap영역에 할당됨
소멸: 객체가 소멸되는 시점 소멸됨=-> gc가 처리함


ex) 게임카드에서 카드의 무늬, 숫자, 폭, 높이 등
클래스 변수
(static변수)
클래스 영역에 선언
인스턴스 변수 앞에 static 붙여서 생성(변수 앞 static(예약어)이 붙어있음 )
모든 인스턴스가 공통된 저장공간 (변수)를 공유
클래스 내 모든 인스턴스가 공통값을 유지해야하는 속성의 경우, 클래스 변수로 선언

생성: 프로그램 시작(메인메서드 호출)과 동시에 메모리 static 영역에 할당
프로그램이 돌아가는 내내 살아있기 때문에 stack, heap영역 모두에서 호출할 수 있음
해당 객체가 생성되지 않더라도 무조건 프로그램 실행과 동시에 할당
(객체 생성없이 사용가능)
소멸: 프로그램 종료시 소멸됨


ex) 게임카드에서 카드의 가로길이, 세로길이 등
지역변수
(local variable)
클래스 영역 내 특정한 구역에 선언 , ex ) 메소드 영역,for문, 초기화블럭..
// for (int i=0; 조건식; 증감식) { } ==> i는 초기식에서 선언된 지역변수임

메소드 내에서 선언하여 메소드 내부에서만 사용 가능
초기화한 후 사용가능

생성: 특정 구역( { } ) 실행 시 메모리 영역 할당 => stack영역 할당
소멸: 특정 구역( { } ) 종료시 소멸 (메소드 종료시 소멸)

2) static 변수(static variable)
- static변수는 객체를 생성하지 않아도 static메모리에 할당되어 선언한 순간 바로 사용이 가능함
(new연산자를 통해 따로 객체 생성하여 heap영역에 올리지 않아도 사용 가능)
-공유의 개념이 강함(재사용성) : 프로그램 실행과 동시에 메모리영역에 공간을 만들어 두고 해당 공간을 공유,
일반적으로 상수 필드와 함께 사용됨
* 상수필드:

public static final 자료형 상수필드명 = 값 ;
public static final int NUMBER = 10;

(1) 한 번 지정한 값을 고정하여 사용, 초기화 필수
final -> 상수 선언, 한 번 지정하고 변경 하지 않겠다
(2) 값이 변경되어서는 안되는 고정값들은 static메모리에 올려두고
(프로그램 시작과 동시에 메모리 영역 할당, 불변의 값) 공유할 목적으로 사용
(3) 상수필드명은 모두 대문자로 기입


3)지역변수 (local variable)

public class FieldTest1 {
	// 필드 (멤버변수, 인스턴스 변수)
	public int global;  // 전역변수(멤버변수, 인스턴스변수), 자동초기화
	public void test(int num) { // test 메소드 시작
		// 지역변수를 사용해보자
		int local = 0; // 지역변수 : 초기화를 해야지 사용가능함
		System.out.println(global); // 필드, 멤버변수: 자동초기화 (0)
		System.out.println(local); // 지역변수 : 자동초기화x
		System.out.println(num); // 지역변수: 자동초기화(0)
	} // test메소드 영역 끝
      
}

public class FieldTest3 {
// 표현법 : 접근제한자 예약어(생략가능) 자료형 필드식별자
	public static String str = "static 변수";  
  	public static final int NUM = 10;

}


public class Run {
	public static void main (String[] args) {
		
 // ----------------FieldTest1---------------------------
	FieldTest1 f1 = new FieldTest1();
	// 객체생성시(new 키워드 사용시) global 멤버변수가 할당됨
	 f1.test(10); // test메소드 호출시 num, local 지역변수 할당
	  // test메소드 호출 종료시 num, local 지역변수 소멸 
	 System.out.println(f1.global);     // 0
	 System.out.println(f1);			// 객체의 주소값을 출력
	 f1 = null; // global멤머변수 소멸 	// 객체의 주소값과 변수의 연결을 끊음 ->객체소멸, 멤버변수 소멸
//	 System.out.println(f1.global);
	 
     
//출력값: 0 0 10 0 com.kh.chapter04.model.vo.FieldTest1@6d06d69c
     
     
	 
 //	 ----------------FieldTest3---------------------------
	System.out.println(FieldTest3.str);   
	// static변수는 객체를 생성하지 않아도 선언한 순간 바로 사용이 가능함 (new연산자를 통해 따로 객체 생성하여 heap영역에 올리지 않아도 사용 가능)
	System.out.println(FieldTest3.NUM); 
  //  ex)   Math.random();  ---> static영역에 random메서드가 올라가 있어서 객체생성없이  사용할 수 있는것임~
	System.out.println(Math.PI); 
	System.out.println(Math.random()); 
	
	// heap 영역: 인스턴스화된 객체
	// stack: 메소드, 지역변수
	// static: static 변수, static메서드, static상수 (static이 붙은 모든것)
	
	}
}




4. 생성자 (constructor)
1) 생성자란?

(1) 메서드 이름이 클래스명과 동일하고, 반환형(리턴자료형)이 없는 메서드
(2) [ 표현법 ]
public 클래스이름 (매개변수 생략가능) { // 해당생성자를 통해 객체 생성시 실행하고자 하는 코드 // }
public Animal ( )  { }
public Animal ( String name, String type ) {   
              this.name = name;
              this.type = type;                }

(3) 생성자를 사용하는 목적:
==> 객체를 생성하기 위해서
==> 객체를 매개변수로 전달된 값들을 바로 필드에 초기화할 목적으로
(4) 생성자의 종류 // 1.매개변수가 없는 생성자(기본생성자) (); // 2. 매개변수가 있는 생성자

(5) 생성자 작성시 주의사항
- 생성자의 이름은 클래스의 이름과 동일해야한다 (대/소문자 일치) 일치하지 않을시 메소드로 인식
- 반환형은 존재하지 않음
- 생성자는 여러개 생성이 가능 (오버로딩 가능, 단, 매개변수 타입이나 갯수가 달라야 함)
- 매개변수 생성자가 들어가있으면JVM이 기본생성자를 만들어주지 않음 ==> 기본생성자를 적는 습관을 들이자

2)생성자의 종류 - 매개변수가 없는 생성자(기본생성자)

- 객체를 생성하기 위한 목적으로 사용 =>기본 생성자 한정, 생략시 JVM이 자동으로 기본생성자 생성
단, 생성자가 단 하나일 경우에만 해당
===>그래도 기본생성자는 항상 작성하자!

public 클래스이름 (매개변수 생략가능) {
//   해당생성자를 통해 객체 생성시 실행하고자 하는 코드	
//	}

public User () {} // 기본생성자는 앞으로 무조건 만들기!, 매개변수가 없는 생성자

3)생성자의 종류 - 매개변수가 있는 생성자
- getter, setter 메소드를 쓰지 않고 생성자 구현부 내에서 바로 초기화 가능

public class User {
	// User  u = new User(); (생성자 constructor)
	// 필드부
	// 회원 id, pw, 이름, 나이, 성별
	private String id;
	private String pw;
	private String name;
	private int age;
	private char gender;
	

	public User(String id, String pw, String name) {    // 매개변수 3개짜리 생성자 
		this.id = id;
		this.pw = pw;
		this.name =name;
	}
 }
 
 public class Run {
	public static void main(String[] args) {
 
 	// 1. 기본생성자를 사용하여 객체 생성 후, setter이용하여 필드값 초기화
	//    (); : 기본생성자
	//  
	User user01 = new User();                        // 기본 생성자로 인식
	user01.setName("유저1");
	user01.setId("user01");
	user01.setPw("userPwd");
	
	System.out.println(user01.information());
	

	
	// 2. 객체 생성과 동시에 필드값 초기화
	// 아이디, 비번, 이름
	
	User user02 = new User("user02", "pass02", "유저2");   // 3개짜리 생성자로 인식 
	
	User user03 = new User("user03", "pass03","유저03", 29, 'F');
	System.out.println(user03.information());
	
	
	
	}
	
}

		
	}
	
	public User (String id, String pw, String name, int age, char gender) {
		this.id = id ;
		this.pw = pw;
		this.name = name;
		this.age = age;
		this.gender = gender;
		
	}


5. 메소드

(1) 메소드 (method) : 입력값을 가지고 어떠한 기능을 수행한 후 결과물 반환
(2) [표현법]
접근제한자 (예약어) 반환타입 메소드식별자 ( 매개변수자료형 매개변수식별자 ) {
                                            수행할 코드;
                                           return 반환값 ;
}

public static String idNumber ( String a ) { 
                                          System.out.println("주민번호입니다")
                                            return a;
}

3) 생략가능한 것: 예약어, 매개변수, return문 (반환형이 void일 경우)//
/ 반환타입: 반환할 값의 자료형
*** 메서드 호출 시 ()안의 데이터타입(인자값)과 메서드의 매개변수 자료형, 개수가 일치하여야 함
메서드는 한 번 정의시 필요할 때마다 호출 가능

 

// * 반환형이 없는 메소드 : 메서드 구현부에 출력문을 작성하는 편 
//* 반환형이 있는 메소드: 호출부에서 출력문 작성


public class MethodTest1 {
public void method1() {
		System.out.println("매개변수와 반환값이 없는 메서드");
		int sum =0;
		for (int i=1; i<=10; i++) {
			sum += i;
		}	
		System.out.println(sum);
		 //	return;  반환타입이 void일 경우 return문 생략가능 (JVM 자동 컴파일), 반환타입이 void일 경우 적지마!!
	
	}	
	// 2. 매개변수는 없으면서 반환값은 있는 메서드
	public int method2() {
		System.out.println("매개변수는 없으면서 반환값은 있는 메서드");
		// 1부터 100까지 랜덤값을 발생시켜 리턴
		return  (int)(Math.random()*100)+1 ;
	}

	// 3. 매개변수는 있으면서 반환값은 없는 메서드
	public void method3(int num1, int num2) {
		System.out.println("매개변수는 있고 반환값은 없는 메소드");
			int min =0;				// 지역변수는 무조건 초기화해야함! 자동초기화 없음
			int max =0;
			
			if (num1 < num2) {
				min = num1;
				max = num2;
			} else { min = num2 ;max=num1;
			}
				System.out.println("최소값은 "+min+ "이며, 최대값은 "+max+"입니다");
				// return; 생략
		public int method4(int a, int b) {		//반환타입을 적는 순간 return문 필수
		System.out.println("매개변수도 있고 반환값도 있는 메소드");
		return a+b;
	}
	
	}
}

public class Run {

	public static void main(String[] args) {
		MethodTest1 m = new MethodTest1();
		m.method1();
		
		int a = m.method2(); // 오: 1~100사이 정수값이 반환되었음
		System.out.println("랜덤값 : "+a);
		System.out.println("랜덤값: " + m.method2());   // 만약 a를 재사용할 필요가 없고 한번만 출력하면 될 경우 별도 변수선언 없이 메소드를 프린트하면 됨 
	}
}




* main메서드가 있는 클래스 & 사용자 정의 자료형

사용자 정의 자료형
1. 참조자료형
2.주소값이 저장되어 있다
3.기본형과의 차이 -->
하나의 자료형 내에 다수의 변수 및 메서드 보유 가능

- 사용자 정의 자료형 Person이라는 클래스를 통해 객체 생성하기

public class Run {
	public static void main (String[] args) {
 	 Person p = new Person(); // 인스턴스화
	 p.method1();
     }
  }