숨 참고 JAVA 다이브 🌊 (7) - 객체, 클래스, 생성자, 이름규칙

joyfulwave·2022년 8월 14일
0

숨 참고 JAVA 다이브

목록 보기
7/21

어려울 거 같아서 미뤄뒀던 프로그래밍 공부 이번에 숨 딱 참고 Java 다이브 💦


💡 객체지향 프로그래밍

프로그램에서 표현하고자 하는 기능을 묶기 위한 단위에요. 객체가 중심이 되는 프로그래밍 기법을 객체지향 프로그래밍이라고 해요.




💡 클래스

객체를 생성하기 위해서는 객체의 설계도가 필요한데, 이러한 역할을 클래스가 해줘요. 공장에서 하나의 설계도를 사용하여 여러 개의 제품을 생산할 수 있는 것처럼 하나의 클래스를 통해 동일한 구조를 갖는 객체를 여러 개 생성할 수 있어요.

📎 객체를 구성하는 단위

  • 객체를 이루는 것은 데이터와 기능이에요.
  • 데이터는 변수로 표현이 돼요. : 객체 안에 포함된 변수를 '멤버변수' 또는 '프로퍼티'라 해요.
  • 기능은 메서드(=함수)로 표현돼요.

📎 클래스의 기본 작성 방법

class 클래스이름{
멤버변수;
void 메서드이름(){...}
}

  class Calc{
  	int max; // 멤버변수, 프로퍼티
    int min = 0;
    void plus(){
    	//...
    }
  }
  • class라는 예약어와 클래스의 이름을 명시하고 {...}블록을 구성해요.
  • 멤버변수는 여러개 존재할 수 있어요. 이때, 값을 선언과 동시에 할당할 수도 있고, 객체를 통해 간접적으로 할당할 수도 있어요.
  • 메서드는 여러 개 존재할 수 있어요.
  • 클래스안에 포함된 멤버변수와 메서드를 특성에 따라 그룹화 하기 위한 기법이 클래스를 작성하는 것이라고 이해할 수 있어요.

📎 객체의 생성 방법

  class Calc{
      ...
  }
  
  public class Main{
 	 public static void main(String[] args){
     	
       
        /*
         < 객체의 선언 >
         클래스이름 객체이름;
        */
         Calc c1; 
        
        /*
         < 객체의 할당 >
         객체이름 = new 클래스이름();
        */
        c2 = new Calc();
        
        /*
         < 선언과 할당의 통합 >
         클래스이름 객체이름 = new 클래스이름();
        */
        Calc c3 = new Calc();
        
     }
  }
  

📎 객체의 사용

  • 객체 안에 포함된 변수나 메서드는 점(.)으로 연결하여 접근할 수 있어요.
  class Calc{
  	 /*
      값이 대입되지 않은 멤버 변수를 갖는 클래스
      -> 클래스란 객체를 위한 틀을 제공하는 것이기 때문에, 클래스 작성 과정에서 멤버 변수에 대입된 값은, 객체를 통하여 멤버변수의 값을 지정하기 전까지 사용될 "기본값"으로서의 의미예요.
	  -> 객체를 통하여 새로운 값이 대입되면 클래스 작성시에 멤버변수에 대입한 값은 의미를 잃어버리게돼요.
	  -> 때문에 일반적으로 클래스 작성시에는 멤버변수에 값을 지정하지 않아요.
      
     */
 	 int max; 
      public static void plus(){      	
      	...
      }
      
       public static void minus(){
       	...
      }
      
      public static void multiply(int x, int y){
      	...
      }
      
      public static void divide(int x, int y){
      	...
      }
      
  }
  
  public class Main{
 	 public static void main(String[] args){
     	
        Calc c = new Calc();
        c.plus(); // (1) 객체 안에 포함된 변수나 메서드는 점(.)으로 연결하여 접근할 수 있어요.       
       
        int num = c.max; // (2) 객체안에 포함된 변수의 값을 다른 변수에 복사할 수 있어요. 변수 = 객체이름.멤버변수;        
        
        c.max = 200; // (3) 객체안에 포함된 변수의 값에 다른 값을 대입할 수 있어요. 객체이름.멤버변수 = 값;
        
        c.minus(); // (4) 객체 안에 포함된 메서드를 호출할 수 있어요. 객체이름.메서드이름();
	
    	c.multiply(10, 20); // (5) 객체 안에 포함된 메서드에 파라미터를 전달할 수 있어요. 객체이름.메서드이름(값1, 값2, ..., 값n);
        
        c.multiply(30, 40);  // (6) 같은 클래스를 통하여 생성된 객체라 할지라도 서로 다른 값을 대입하면 서로 독립적인 형태로 존재하게 돼요. 
        
     }
  }
  

📎 메서드와 클래스

⚫️ 메서드를 포함하는 클래스

  • 메서드란 프로그램에서 하나의 동작 단위를 의미해요.
  • 두 개 이상의 메서드가 서로 동일한 대상을 위해서 존재할 경우, 이 메서드들을 클래스에 포함시켜 그룹화 할 수 있어요.
  class Calculation{]
      public static void plus() { ... }
      public static void minus() { ... }
      public static void multiply() { ... }
      public static void divide() { ... }
  }
  • 클래스에 멤버변수와 메서드가 공존할 경우, 멤버변수는 모든 메서드가 공유하는 전역 변수로 존재하게 돼요.
  class Calculation{]
  	  int num; // 멤버변수(= 전역변수, global variable) : 클래스 안에서 선언된 변수로서, 클래스 블록범위 안에서 유효해요.
      public static void plus() { 
      	int x = 0; // 지역변수(= local variable) : 메서드 안에서 선언된 변수로서, 메서드의 블록을 빠져나가지 못해요. 그러므로 다른 메서드는 해당 변수를 인식하지 못해요. 이 규칙은 조건문, 반복문과 같은 블록{}을 형성하는 모든 경우에 해당돼요.
      }
      public static void minus() { ... }
      public static void multiply() { ... }
      public static void divide() { ... }
  }

⚫️ 메서드만을 포함하는 클래스

  • 객체안에 멤버변수(=데이터)가 포함되지 않는다.
  • 객체안에 포함된 메서드를 호출하여 결과를 만들기 위한 목적이므로, 굳이 여러개의 객체를 생성할 필요가 없다.

📎 this

클래스 안에서 this를 사용하여 자기자신을 표현해요.

  class User{
          String name;	// 전역변수 "자바학생"이 입력됌
          public void setName{
              String name;	//지역변수 "사용자" 가 입력됌
              name = "사용자";
              this.name = "자바학생";
          }
      } 
  • 파라미터도 해당 메서드 안에서만 유효한 지역변수의 일종이에요.
  • 파라미터를 사용하여 멤버변수의 값을 간접적으로 설정하고자 할 경우, 변수의 이름을 서로 다르게 사용하는 것보다는 이름은 동일하게 지정하고 this 키워드를 사용하여 멤버변수와 파라미터를 구별하는 것이 java언어의 일반적인 처리 방식이에요.
  • 모든 멤버변수 앞에는 this 키워드를 사용하여 멤버변수임을 직관적으로 표시하는 것이 소스코드의 가독성을 위해서 바람직해요.

⚫️ 현재 클래스의 메서드를 의미하는 용도로서의 this

  class User{
          public String getName(){
              String name = "자바학생";
              return name;
          }

          public void sayName(){
              String myname = this.getName();
              System.out.println(myname);
          }
      }

-> getName()을 호출하고 있는 메서드는 this키워드를 사용하여 현재 클래스 안에 포함된 다른 메서드임을 명시하고있어요. 하지만 메서드의 경우 다른 클래스의 메서드를 이름만으로 호출할 수 있는 방법이 없기때문에, this.getName(); 가 아닌, getName()만 사용하더라도 코드 가독성의 문제는 없기 때문에 잘 사용하지 아요.




💡 생성자

  • new 키워드를 사용하여 객체가 생성될 때 자동으로 실행되는 특수한 형태의 메서드
  • 리턴형을 명시하지 않으며, 메서드의 이름은 클래스와 동일하다.
  • 자동으로 실행된다는 특성 때문에, 객체가 생성되면서 해당 객체의 특성을 초기화하기 위하여 사용돼요. (ex: 멤버변수의 초기값을 할당하는 용도)
  class Member{ //(2) 코드상 나타나지는 않지만 객체가 생성되면서 자동으로 실행
      Member(){
      // 이 안은 객체가 생성될 때 자동으로 호출된다.
      }
  }

  public class Main {

    public static void main(String[] args){
      Member m1 = new Member(); // (1) 객체 생성
    }

  }

📎 기본 생성자

  • 파라미터가 없는 생성자
  • 클래스에 특별히 생성자가 정의되지 않은 경우, Java 컴파일러가 기본생성자가 존재한다고 인식해요.
    class User{ 
        User(){
          // 생성자는 있지만, 내용은 비어있다.
        }
    }

    public class Main {

      public static void main(String[] args){
        User user = new User(); // 
      }

    }

📎 파라미터를 갖는 생성자

  • 생성자도 메서드의 한 종류이므로 파라미터를 함께 정의하는 것이 가능해요.
  • 생성자의 파라미터를 멤버변수에 복사하는 것으로 객체의 초기화를 외부적인 요인에 의해 처리할 수 있어요.
  class Article{
      int seq; 			// 글 번호
      String subject; 	// 글 제목
      String writer; 		// 작성자	

      Article(int seq, String subject, String writer){
          this.seq = seq;
          this.subject = subject;
          this.writer = writer;
      }

      void print() {
          System.out.println("글 번호 : " + this.seq);
          System.out.println("글 제목 : " + this.subject);
          System.out.println("작성자 : " + this.writer);
      }
  }

  public class Main09 {

      public static void main(String[] args) {
          
          Article article = new Article(1, "과학", "아인슈타인");
          article.print();
      }

  }
  
  /*
  	출력결과)
    글 번호 : 1
    글 제목 : 과학
    작성자 : 아인슈타인

  */



💡 이름규칙

공통 : 영어 + 숫자 + 언더바(_)의 조합이고, 첫 글자는 반드시 영어로 표기해요.

⚫️ 클래스

  • 첫 글자는 대문자로 시작, 나머지 글자는 소문자로 표시한다.
  • 두개 이상의 단어를 조합해야 할 경우, 새로운 단어는 대문자로 시작한다.
	class MyClass
	class Student
	class NetworkHelper

⚫️ 메서드, 변수

  • 대부분 소문자로 구성되지만, 두 개 이상의 단어를 조합할 경우 새로운 단어는 대문자로 표시해요.
	int age;
    int maxNumber;
	Stiring userName;

⚫️ 상수

  • 모두 대문자로 표시해요.
	final double PI;
	final int COLOR;



다음 다이브에서 또 만나요 🌊




출처
https://media.giphy.com/media/l2Je1bFuOpkNpyqYM/giphy.gif
https://media.giphy.com/media/Jbb3KS22397YQ/giphy.gif

0개의 댓글