Dev/Java

Java - 클래스 ( Class )

surimi🍥 2020. 8. 14. 10:00
반응형
 1. 클래스란?
 
	      개별의 작은 프로그램으로써, 우리가 클래스를 하나의 자료형처럼 다루고
	      클래스의 변수, 즉 객체라는 것을 만들어서 다른 프로그램 안에서 통째로 사용하게
	      된다.
	      클래스에는 정보를 저장하는 필드와 그리고 해당 클래스의 기능을 구현해놓은
	      메소드로 이루어져 있다.
          
	      A. 필드
	         필드란 해당 클래스에 저장되는 데이터의 영역을 우리가 확보하는 것이다.
	         똑같은 Student 라는 클래스의 객체들이더라도
	         그 안의 필드가 어떤 데이터를 가지는지에 따라 다른 객체로 되는 것이다.
	         예를 들어 Student 객체 s 에는 이름은 김철수, 나이 15세, 학생번호 1
	         ..... 요런 정보들이 들어있고, Student 객체 s2에는 이름은 김영희, 
	         나이 14세, 학생번호 2 ..... 이런 정보가 들어가게 되는데
	         우리가 김철수 학생에 대한 클래스 따로, 김영희 학생에 대한 클래스를 따로 만드는게
	         아니라 하나의 Student 클래스로 2개의 객체를 만들어서 정보를 다르게 세팅하면
	         되는 것이다.
	         핸드폰을 생각해보자. 갤럭시 노트 20을 산다고 가정할 때 공장에서 
	         고객이 노트 20 주세요 하면 설계도부터 따로따로 만드는게 아니라
	         하나의 설계도가 여러개의 갤럭시 노트 20을 만들고, 새 핸드폰 마다
	         시리얼이나 관리 번호같은게 달라질 뿐이다. 또한 사용자는 그것을 받아서
	         자기가 원하는 정보를 세팅하면 자기의 핸드폰이 되는것이다.
             
	         가. 필드를 선언하는 방법
	            필드는 클래스의 가장 윗부분에 즉 
	            public class ~~~ {
	            다음에 바로 클래스가 필요로 하거나 가지고 있을 정보를 하나하나
	            변수 선언 하듯이
	            데이터타입 필드이름; 으로 적어주면 된다.
	            예를 들어서 학생 클래스라면
	            String name;
	            int age, korean, english, math;
	            이렇게 적어주면 된다.
	            이렇게 우리는 객체에 들어갈 정보의 틀만 규정해주고 실제 어떤 데이터가 
	            들어갈지는 객체를 사용하는 곳에서 넣어주면 된다!
	            
	            필드 이름의 경우, 파라미터와 같을 수도 있다. 
	            만약 파라미터와 필드의 이름이 같으면 해당 메소드에서 
	            그 이름이 가르키는 것은 파라미터가 된다.
	            만약 이러한 경우에서 필드를 가르키고 싶으면 
	            이 메소드를 호출한 객체 라는 의미에서
	            this 라고 적고
	            그 객체의 필드 라는 의미로
	            this.필드이름 으로 가르키면 된다.
	             
	      B. 메소드
	         메소드란 해당 클래스로 만든 모든 객체들이 공통으로 가지고 있는 기능이다.
	         예를 들어, Student 클래스에 총점 계산하는 기능이 있다고 한다면
	         김철수 학생 총점 계산할때와 김영희 학생 총점 계산할 때 
	         기능이 달라져야 할까요? 답은 아니다. 필드에 저장되어 있는 국어, 영어, 수학
	         점수들만 다 합쳐주면 되기 때문에 기능이 달라지는 것이 아니다!
	   
	   2. 접근제한자 (Access Modifier)
	      접근제한자란 해당 필드 혹은 메소드가 외부 패키지 혹은 외부 클래스의 접근 여부를
	      결정해주는 키워드이다.
	      public
	         퍼블릭 접근 제한자는 외부 패키지, 외부 클래스 모두 접근 가능하다.
	         
	      protected
	         프로텍티드 접근 제한자는 외부 패키지에 있는 클래스면 상속을 받아야지만
	         접근 가능하다. 내부 패키지는 모든 클래스가 접근 가능하다.
	         
	      default
	         디폴트 접근 제한자는 외부 패키지에 있는 클래스면 모두 접근을 막고
	         내부 패키지에 있는 클래스면 모두 접근 가능하다.
	         만약 우리가 필드나 메소드에 아무런 접근 제한자를 적어주지 않으면
	         디폴트 접근 제한자가 적용된다. 하지만 디폴트를 적어주면 에러가 난다.
	         왜냐! 디폴트는 switch 조건문에서 사용하는 예약어이기 때문!!!
	         
	      private
	         프라이빗 접근 제한자는 외부 패키지건 내부 패키지건 클래스가 달라지면
	         호출 자체를 막아버린다. 클래스 내부에서만 해당 필드 혹은 메소드를
	         직접 호출할 수 있다. 이제는 우리가 모든 필드는 private, 외부에서
	         호출하지 않을 메소드들도 private으로 설정한다.
	   
	   3. static 
	      static이란 해당 메소드나 필드를 객체 선언 없이 곧장 사용할 수 있게 
	      등록하는 키워드이다. 만약 static 메소드가 다른 메소드나 필드를 호출하면
	      해당 메소드 혹은 필드도 반드시 static을 적용시켜야 한다.
	      
	   4. null
	      null이란 참조형 변수가 선언되서 메모리값은 부여가 되어있지만
	      해당 메모리 주소에는 아무것도 없는 상태를 null이라고 한다!
	      null인 상태에선 필드나 메소드에 접근 자체가 불가능하다!
	      접근할려고 하면 NullPointerException이라는 에러가 발생한다!
	   
	   5. 생성자
	      생성자란 해당 클래스의 객체가 만들어질 때 필드 값 초기화 등의 기본 작업을
	      실행하는 메소드이다.
	      생성자는 해당 클래스와 이름이 똑같고, 리턴 타입이 존재하지 않는다.
	      우리가 따로 만들지 않아도 자바에서 기본적으로 제공해주는 생성자가 있는데
	      이 자바가 기본적으로 제공해주는 생성자는
	      참조형 데이터타입의 필드는 null로, 기본형 데이터타입의 필드는 0으로 초기화한다.
	      
	      만약 우리가 생성자를 따로 만들어주게된다면 더이상 자바가 제공해주는
	      기본 생성자는 호출할 수 없다.
	      우리가 생성자를 만들 때 주의해야할 점은
	      만약 우리가 파라미터가 있는 생성자만 만들어준다면
	      더이상 파라미터 없는 생성자는 호출 할 수 없게 된다!
	      
	      만약 여러분이 파라미터가 있는 생성자와 파라미터가 없는 생성자가 모두 필요하면
	      모두 만들어주어야만 한다!
	      
	      이렇게 메소드가 같은 이름이지만 파라미터가 달라지는 것을 오버로딩이라고 한다.
	   
	   6. 오버로딩
	      오버로딩이란 같은 이름의 메소드지만 파라미터가 다른 것을 오버로딩이라고 한다.
	      오버로딩을 하는 이유는 같은 기능을 가졌지만 파라미터가 다른 경우 
	      구현 내용이 달라지기 때문이다.
	      예를 들어, System.out.println()의 경우, 
	      파라미터가 없을때, int가 파라미터인 경우, long이 파라미터인 경우....
	      총 9번 오버로딩 되어있다.
	      단 오버로딩을 할 때 주의할 점은
	      파라미터가 달라져야 한다는 것이다.
	      파라미터가 달라져야 한다는 것은
	      파라미터의 데이터타입의 순서가 달라야 한다는 것이다.
	      print(String name, String number)와
	      print(String number, String name)은 파라미터가 같다.
	      왜냐하면 둘다 데이터타입의 순서가 String, String 이기 때문이다.
	      우리가 호출할 때 print("조재영", "조재영")을 하게 되면
	      둘중 어느것이 호출될까? -> 자바가 그걸 어떻게 아나요...
	      
	      
	      print(String name, int year)와
	      print(int year, String name)의 파라미터는 다르다.
	      왜냐면 하나는 String, int 이고 하나는 int, year 이기 때문.
	      따라서 print("조재영", 13) 이라고 적어주면
	      당연하게 print(String name, int year)가 호출된다.
	      
	   7. 데이터 은닉화와 캡슐화
	      앞서 접근제한자를 설명하면서 이제 모든 필드는 private으로 둔다고 했었다.
	      하지만 private으로 하는 순간 외부 클래스는 더이상 해당 필드를 직접 접근할 수 없다.
	      대신 해당 필드에 값을 넣는 메소드와 해당 필드에 저장된 데이터를 호출하는
	      메소드를 필드마다 만들어서 그 메소드들로 값을 저장하고 호출하게 한다.
	      이렇게 필드를 private으로 설정해서 숨기는 것을 은닉화 라고 하고
	      그리고 메소드들을 통해서 값을 저장하고 호출하는 것을 캡슐화 라고 한다.
	      
	      A. 캡슐화
	      		캡슐화를 할 때에는 값을 저장할 때에는 setter 메소드를상ㅇ하고
	      		값을 호출할 때에는 getter 메소드를 사용한다.
	      		a. Setter
	      			setter메소드는 다음과 같은 양식을 가진다.
	      			public void set필드명 (필드와 똑같이 생긴 파라미터) {
	      				this.필드명 = 파라미터명;
	      			}
	      		b. Getter
	      			getter메소드는 다음과 같은 양식을 가진다.
	      			public 필드타입 get 필드명() {
	      				return 필드명;
	      			}
	      
	   8. 상속
	   	프로그래민에서 상속은 자식 클래스가 부모 클래스의 메소드를 물려받아서
	   	자식 클래스는 구현하지 않더라도 부모 클래스의 코드를 그래도 재사용하기 위해서	 
	   	상속을 한다.
	   	java의 모든 클래스는 java.lang.Object라는 클래스를
	   	내부적으로 상속 받는다.
	   
	   	이 java.lang.Object라는 클래스에는 기본적으로 생성자, toString(),
	   	equals() 등의 메소드들이 있고 따라서 자식 클래스가 해당 메소드들을 사용할 수 있다.
	   
	   	하지만 이 java.lang.Object 클래스는 자식 클래스의 필드를 알 수 없기 때문에	
	   	해당 메소드들은 매우 애매모호가게 적혀있다.
	   	예를 들어서 toString()의 경우
	   	해당 클래스의 패키지.해당클래스 이름@객체의 메모리 주소값이 return 되도록
	   	되어있다.
	   
	   	당연하게도 우리는 그러한 String값이 필요 없기 때문에 만약 우리가 toString()을
	   	제대로 사용하려면 우리 클래스에서 해당 메소드를 재정의해주어야 한다.
	   
	   	이렇게 부모클래스의 메소드를 자식 클래스가 재정의하는 것을 오버라이드라고 한다.
	   	오버라이드를 할 때 주의할 것은 부모 클래스가 해당 메소드를 선언할 때와
	   	똑같이 적어주어야 한다는 것이다.
	   
	   
	   9. 다형성 (Polymorphism)
	   	다형성이란 다양한 모습을 가질 수 있는 성질을 다향성이라고 한다.
	   	파라미터나 변수의 데이터타입, 필드의 데이터타입에 부모 클래스를 적게된다면
	   	그 클래스를 상속받는 모든 크래스가 거기에 들어갈 수 있다.
	   
	   	다형성을 실제로 한번 경험해보자
	   	객체끼리의 비교는 equals() 메소드를 사용하여 비교한다.
	   	그 equals() 메소드의 파라미터는 Object obj로 정의되었기 때문에
	   	Object를 상속받는 클래스, 즉 자바의 모든 클래스가 파라미터로 들어올 수 있다.
	   
반응형

'Dev > Java' 카테고리의 다른 글

Java - 클래스 이용 학생 관리 연습  (0) 2020.08.14
Java - 클래스 이용 차 관리 연습  (0) 2020.08.14
Java - 예제 ) 별찍기 02  (0) 2020.08.12
Java - 예제 ) 별찍기 01  (0) 2020.08.12
Java 예제  (0) 2020.08.11