본문 바로가기
JAVA

자바 강의 7

by leek94 2023. 1. 27.

Ch07. 메서드와 생성자


 메서드 (Method)

 

  • OOP에서 객체의 action(능) 을 정의하는 부분을 operation이라고 하는데 이 operationjava에서는 메서드(method) 라고 한다  
  • 업을 수행하기 위한 명령문의 집합  
  • 메서드의 장점성 지  
    • 적인 드를 이고 드의 리가 용이하다 (재사용성)   
    • 메서드를 면 객체가 어 일을 하는지 알 수 있다  
    • 객체가 무슨 일을 해 지 정의 수 있다  
    • 정하거나 가져 수 있다  
    • 하나의 메서드는 한 가지 기능만 수행하도록 성하는 , 이를 해 재사용성을 일 수 있다

 

메서드 선언

 

제한자 [지정예] 과형_리턴          메서드                (개변수 목록)        [throws 예외클래스들] {     Access    Non-access  (return_type)   (method_identifier)     (Parameter List)          (Exception class)    modifiers   Modifiers                 method body  }

 

  • Method Signature : 메서드와 파라미터 리스트 포함하여 Method Signature라고 하며 모든 메서드에 존재한다  
  • 접근제한자(Access modifier  : 접근제한자는 메서드의 접근 유형으로 4 가지의  접근제한자를 제공한다 
    • public : 모든 클래스에서 메서드에 접근할 수 있다 
    • private : 메서드가 정의된 클래스에서만 접근할 수 있다 
    • protected : 동일한 패키지 또는 다른 패키지의 하위 클래스내에서 메서드에 접근할 수 있다 
    • default : 메서드 선언시 접근제한자를 지정하지 않으면 java에서는default 접근제한자를 지정하며, 동일한 패키지에서만 볼 수 있다 
  • 비접근제한자(Non-access modifier  : static 과 같은 키워드를 사용할 수 있다

 

  • 결과형 리턴값  
    • 메서드 실행 후 결과를 호출한 곳으로 되돌려 주는 값 
    • void(결과가 없을때 , 자료형(boolean, int, String 등 , 클래스나 인터페이스 등을  넘겨줄 수 있다 
    • return 예약어 사용 
  • 메서드명 : main 메서드를 제외하고 사용자가 임의로 정하며, 메서드의 기능과 일치해야 한다. 메서드는 메서드 이름으로 호출된다 
  • 매개 변수 목록 : 메서드의 코드를 수행하기 위해 필요한 변수로 메서드 호출시 필요한 값을 넘겨 줄 수 있다. 쉼표로 구분되고 ( 로 묶인다. 여기에는 데이터 유형과  변수 이름이 포함된다 
  • 예외클래스 : 메서드 내부에 예외가 발생할 경우 그 예외를 Calling method에 위임하기 위해 사용 
  • 메서드 본문(method body  : 이 메서드가 수행할 모든 작업이 포함된다. 중괄호( { }   블럭안에 구현한다 
  • 메서드 이름 명명규칙 
    • 동사이며선 소문자로 시작한다 
    • 메서드 이름이 두 단어 이상인 경우 첫번째 단어를 제외하고 각  단어의 첫글자는 대문자여야 한다 
    • 예  sum() , areaOfCircle()

return문

 

  • 메서드가 정상적으로 종료되는 경우  
    • 메서드의 블럭( 의 끝에 도달했을 때  
    • 메서드의 블럭( 을 수행 도중 return문을 만났을 때  
  • return 문  
    • 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다  
    • 반환값이 없는 경우(void  : return 문을 생략하거나 작성해주면 된다  예)  return;  
    • 반환값이 있는 경우 : return 문 뒤에 반환값을 지정해 주어야 한다           예)  return 반환값;

 

return 문 주의사항

 

  • return 값이 있는 메서드는 모든 경우에 return문이 있어야 한다
  • return 받는 변수는 return type하고 동일한 type 이거나 큰 상위 type 이어야만 한다

  • return 문의 개수는 최소화하는 것이 좋다

 

Worker methode & Calling method

 

  • 지금까지의 예제는 main method에 모든 action을 정의했다면 이제 부터는  task-specific한 method에 선언하고 정의해야 한다
  • main method에 모든것을 정의하게 되면 method하나로 모든걸 처리 하기 때문에  simple 한것 같지만 단점이 있다 
  • 비실용적이고 사이즈만 커져버린 application이 되버린다 
  • OO(Object-Oriented) 을 사용하지 않았다 
  • 재사용하기 힘들다 
  • Calling method는 기능을 호출하는 method, 호출되어 기능을 수행하는  method를 Worker method 라고 한다

메서드 유형

 

  • Java에서는 두 가지 유형의 메서드가 있다 (Predefined Method, User-defined Method)   
  • Predefined Method (사전 정의된 메서드  : Java 클래스 라이브러리에 이미 정의된 메서드 를 Predefined Method라고 한다 
  • standard library method 또는 built-in method 라고도 한다 
  • length() , equals() , sqrt() , print()  등은 별도 선언 없이 바로 사용할 수 있다 
  • max()  메서드의 Java API Document를 보면 접근 제한자 public, 지정 예약어 static,  리턴 데이터 유형 int,  메서드 이름 max() , 매개변수 목록 (int a, int b)  이 있다 
  • User-defined Method (사용자 정의 메서드  : 어떤 요구사항이나 필요에 의해 프로그래머 가 개발한 메서드를 사용자 정의 메서드라고 한다. 이런 메서드는 비즈니스 요구사항이 변경 되면 같이 변경된다

메서드  - Passing Arguments

 

  • Argument(매개변수 는 메서드에게 어떤 값을 전달할 때 사용한다  
  • 매개변수는 리터럴(literal  또는 변수(variable 가 될 수 있다

* User-defined Method

 

Object method(instance method)와 Static method

 

  • Object method(instance method   
    • Object method는 object를 생성해야만 호출할 수 있다 
    • Object method는 instance method라고도 하며, 메서드 내에서 인스턴스 변수를 사용할 수 있다 
    • Object method는 “참조변수명.method명( ” 으로 접근한다 
  • Static method(class method   
    • object를 생성하지 않고 호출할 수 있으며 class method라고도 불린다 
    • 클래스의 인스턴스가 아닌 클래스에 속하는 메서드이다 
    • Static method는 method 정의시 static keyword를 사용한다 
    • Java API중에도 Static method들이 존재한다. (예: Math.random(   
    • object의 생성 없이도 접근이 가능한 method를 정의할 때 사용한다(예를 들자면 Utility class의 문자변환 기능, 날짜 변환 기능 등   
    • static 멤버(변수,메서드 에 접근하고 값을 변경할 수 있으며, 대표적인 static method로 main(  메서드가 있다 
    • Static method는 “클래스명.method명( ” 으로 접근한다 
    • Statid method 예 : Date today = Util.getDate( ; <- static method

 

  • Object method는 Accessor method,  Mutator method 두 가지 유형이 있다  
  • Accessor method(접근자 메서드   
  • 인스턴스 변수를 read하는 메서드이다. 메서드 앞에 get  단어가 붙어서 쉽게 식별할 수 있으며, getter라고도 한다 
  • private 변수의 값을 반환한다               예)               public int getNumber(  {  return number;               } 
  • Mutator method (설정 메서드   
  • 인스턴스 변수를 값을 수정하는 메서드로 메서드 앞에 set 단어가 붙기 때문에 쉽게 식별할 수 있다. setter라고도 한다 
  • 반환값이 없으며, 동일한 데이터 타입의 매개변수를 허용하여 private 변수의 값을 설정하는데 사용된다 
  • 외부에서 값을 변경할 필요가 없는 불변(immutable 객체의 경우 setter 메서드를 만들면 안된다(예 : 주소객체 등과 같은 생성 후  값이 변하지 않는 객체                 예                 public void setNumber( int number   {                               this. number = number;

 

  • Accessor method, Mutator method 예)

  • Static method 예제

  • 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다.  그러나 static멤버들은 인스턴스멤버들을 참조할 수 없고 static은 static 간에 참조나 호출이 가능하다  
  • static method 영역은 객체 생성 없이 접근할 수 있지만 Object method 는 객체 생성이 되어야만 호출될 수 있기 때문에  static 영역에서 호출이  불가능하다

 

  • 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다 (read only)   
  • 참조형 매개변수 - 변수의 값을 읽거나 변경할 수 있다 
  • Call by Name 
    • 이름으로 메서드를 호출하는 방식으로 특정 매개변수 없이 실행 
    • 이미 결정된 결과를 출력하거나 고정된 실행을 요구하는 것 외에는 다른 기능이 없다 
    • 예  System.out.println() ; 
  • Call by Value 
    • 이름으로 메서드를 호출할 때 특정 매개변수를 전달하여 그 값을 이용해 실행 
    • 매개변수는 개수 제한, 자료형 제약이 없다 
    • 예)  System.exit(1) ; 
  • Call by Reference 
    • 메서드 호출 시 매개변수로 사용되는 값이 특정 위치를 참조

 

Pass by Value/ Pass by Reference

 

  • 자바는 값을 인자에 의해서만 전달한다  
  • 한 객체의 인스턴스가 메소드의 인자로 전달될 때 그 인자의 값은 객체에 대한 레퍼런 스(참조값  이다 
  • 객체의 내용은 호출된 메소드 내에서 변경될 수 있다. 그러나 객체의 레퍼런스는 절대  변경되지 않는다 
  • Pass by value : 메서드가 호출되면 호출자는 인수 변수의 복사본을 메서드에 전달하여  메모리에 두 개의 값을 생성한다 
  • Pass by Reference : 메서드가 호출될 때 메서드 인수는 메모리에서 호출자와 동일한  변수를 참조한다

 

Pass by Value

  • 기본 데이터 타입인 int 타입 foo 변수가 setFoot(  매개변수로 전달되면 메서드 별로 두개 의 스택에 개별 변수가 만들어지면서 foo 변수 값의 복사본이 bar로  전달된다  
  • setFoo(  메서드안에서 bar 매개변수의 값을 2로 변경한다

 

public class PassByValueEx1 {

public static void main(String args[]) {

int foo = 1;

System.out.println(foo) ; // 1

// Pass by value

setFoo(foo) ;

System.out.println(foo) ; // 1

}

public static void setFoo(int bar

{ // bar = 1 bar = 2;}}

 

 

Pass by Reference

 

  • spill(  메서드가 호출되면 매개 변수는 mugToBeSpilled 매개변수로 객체 참조 변수의 복사본 이 전달됩니다  
  • spill(  메서드에서는 복사본 참조변수를 통해 contents의 값을 “Nothing"으로 변경한다 
  • myMug, mugToBeSpilled 두 참조변수 모두 하나의 객체를 바라본다

 

메서드 오버로딩이란(Method overloading)

 

  • 하나의 Class내에 동일한 이름으로 동일한 작업을 하는 여러 개의 method를 구현 하는 것을 말하며, 다중의 의미를 부여할 수 있다  
  • 하나의 작업만 수행해야 하는 경우 메서드의 이름이 동일하면 프로그램의 가독성 이 높아지고, 기능은 동일하나 매개변수 목록이나 타입에 따라 호출되는 메서드를  제어하고자 할 경우 사용된다 
  • argument의 개수가 다르거나 argument의 자료형이 다른 동일한 이름의  method를 구현한다 
  • 오버로딩 조건 
    • 메서드 이름이 동일해야 한다 
    • 매개변수의 개수 또는 타입이 달라야 한다 
    • return type, modifier는 오버로딩 조건에 영향을 미치지 않는다 
    • 매개변수는 같고 리턴타입이 다른 경우는 오버로딩 조건이 되지 않는다 
  • 오버로딩의 예 
  • PrintStream class의 print 와 println method

 

  • 매개변수를 다르게 하거나 타입을 변경하여 메서드 오버로딩을 구현한 예

 

 

생성자(Constructor)란?

 

  • 생성자는 클래스의 인스턴스 생성에 사용되며, 객체가 생성될 때 멤버변수들의 값을 초기화  하는 기능을 한다  
  • 클래스가 생성자 선언을 하지 않으면, 매개변수가 없는 디폴트 생성자(default constructor  가 자동으로  제공된다 
  • 기본 생성자는 데이터 타입에 따라 0, null과 같은 객체의 기본값을 제공하기위해 사용된다 
  • 디폴트 생성자는 컴파일러에 의해 제공되며 암묵적으로 public이 접근제한자로 선언된다 
  • 생성자는 메소드와 흡사하지만 메소드는 아니다 
  • 생성자는 메소드 호출방식으로 호출될 수 없으며, 인스턴스 생성시점에만 호출 된다 
  • 생성자는 항상 객체를 잠그고, 객체의 모든 생성자 작업을 마칠 때까지 다른 스레드에서 이를   정상적으로 사용할 수 없도록 한다 
  • 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다 
  • 생성자를 호출할 때 객체에 대한 메모리가 JVM Heap 메모리 영역에 할당 된다 
  • new 키워드를 사용하여 객체를 생성할 때마다 생성자가 호출된다 
  • 생성자는 매개변수가 없는 생성자와 있는 생성자 두 개로 나뉜다

 

생성자 작성 규칙

 

  • 생성자의 이름은 클래스의 이름과 같아야 한다  
  • 생성자는 리턴값이 없다. (하지만 void를 쓰지 않는다   
  • 생성자의 접근제한자로는 public, protected, private를 선언할 수 있으며, 접근제한자가 없다면 default 접근제한자로 선언된다 
  • 생성자에는 abstract, static, final, synchronized 키워드를 사용할 수 없다 
  • 생성자가 오버로딩된 다른 생성자를 호출할 수 있다 
  • new 라는 keyword를 이용해서 객체를 생성할 때 자동적으로 default constructor가 호출 된다                                    ▶  Person person = new Person() ;

● 기본 문법

   클래스이름(타입 변수명, 타입 변수명, … )

  {  // 주로 인스턴스 변수의 초기화 코드를}

 

생성자 오버로딩

 

  • 생성자를 오버로딩한 경우 기본 생성자(default constructor 를 호출하여 객체를 생성하고자 할 경우에는 컴파일러가 자동으로 생성해주지 않기 때문에  기본 생성자를 클래스에 명시적으로 구현해야 한다

 

  • 생성자의 오버로딩은 메서드 오버로딩과 동일한 방식으로 구현한다  
  • 다른 매개변수 리스트를 가지는 생성자들로 구성하며, 매개변수 수와 유형에 따라 컴파일러에 의해 구분된다

Copy 생성자

 

  • Java에서 자사 생성자는 없지만 한 객체에서 다른 객체로 값을 복사하는 방식을 처리할 수 있다.

public class CopyConstructorEx1 {

int id;

String name

; CopyConstructorEx1(int i,String n){

id = i;

name = n; }

//constructor to initialize another object

CopyConstructorEx1(CopyConstructorEx1 originObj){

id = originObj.id;

name = originObj.name; }

void display(){

System.out.println(id+" "+name);

}

public static void main(String args[]){

CopyConstructorEx1 obj = new CopyConstructorEx1(123,"홍길동");

CopyConstructorEx1 copyObj = new CopyConstructorEx1( obj );

obj.display();

copyObj.display(); } }

 

 

생성자와 메서드의 차이점

 

  • 생성자와 메서드의 주요 차이점은 return type이 없고, 사용 용도가 다르며, 호출 시점이 다르다는 것이다

'JAVA' 카테고리의 다른 글

스트림 3  (0) 2023.03.03
스트림2  (0) 2023.02.24
자바 강의 6  (0) 2023.01.13
자바 강의 5  (0) 2023.01.02
자바 강의 4  (0) 2022.12.28