본문 바로가기
프로그래밍/java

java 접근제어자, 메소드 오버로딩, 생성자, this 정리

by 뜨끔쓰 2019. 4. 22.
728x90
728x90

안녕하세요


오늘은 java의 접근제어자, 메소드 오버로딩, 생성자 this에 대하여 정리해보려고합니다.


java하면 떠오르는게 무엇일까요? 바로 객체지향 프로그래밍언어라는 말이 떠오르시나요??


그러시면 이미 성공하신거라고 생각됩니다. 이 객체지향 프로그래밍은 전 글에서 배웠듯이 자동차라는 틀을 하나 만들어 놓으면 여러대의 자동차를 고객의


입맛에 맞게 조금씩 변형하여 재생산을 계속 해낼 수 있습니다. 이처럼 객체지향 프로그래밍을 하는데에 있어 java는 직접적인 값의 호출과 값의 변경을 지향하지 않습니다.


그렇기 때문에 java에서는 접근제어자라는 것을 이용하여 직접적인 값의 접근을 막을 수 있습니다.



접근제어자란?

접근제어자는 변수와 메소드들에 사용되며, 외부에서의 접근권한을 설정하는 것을 접근제어자라고 합니다.
접근제어자는 기본적으로 4가지가 있는데 아래와 같습니다.

 

 public

protected 

default 

private 

동일 패키지O, 동일클래스O

O

O

O

O

동일 패키지O, 상속관계O

O

O

O

X

동일 패키지O, 상속관계X

O

O

O

X

동일 패키지X, 상속관계O

O

O

X

X

동일 패키지X, 상속관계X

O

X

X

X


이표는 직접 외우시려고하면 아마 잘 외워지지 않으실꺼에요. 직접 코드를 작성하여 어떨때 접근이 가능한지, 접근 불가능한지 해보시면 금방 외워지실꺼에요.


예를 한번 봐봅시다.


public class Car {
     private String name;
     private int createYear;
}


Car라는 클래스가 있는데, String name, int createYear 변수 선언 앞에 private라는 신기한게 보이시죠?

위의 표에 따르면, private는 동일패키지, 동일클래스에서만 접근이 가능하다고합니다.


public class Main {
     public static void main(String[] args) {
         Car c1 = new car();
         c1.name = "소나타";
     }
}


이렇게 메인 클래스에서 직접적으로 name변수에 접근하려면 에러가 뜨실꺼에요. 앞으로는 이렇게 사용하시며 안되고

java에서 중요한 getter, setter를 이용하여 변수값의 호출 및 변경을 하셔야합니다.


public class Car {
     private String name;
     private int createYear;

     String getName(){
          return name;
     }
     void setName(String newName){
          name = newName;
     }
     int getCreateYear(){
          return createYear;
     }
     void setCreateYear(int newCreateYear){
          createYear = newCreateYear;
     }
}


Car클래스를 이렇게 작성하시고, main에서 메소드를 불러와서 값의 변경 및 호출 하시는 방식을 이용하시면 됩니다.

아직 상속에 대하여 배우지 않아서, 이정도까지만 알고 있으면 될 것 같습니다.






다음으로 메소드 오버로딩에 대하여 알아보도록 하겠습니다.

메소드 오버로딩이란?

메소드 오버로딩이란, 한 클래스 내에 이름이 같은 메소드를 2개이상 정의 할 수 있도록 하는것을 말합니다.

기본적으로 메소드 오버로딩을 사용하려면 다음과 같은 조건이 필요합니다.
  1. 메소드 이름이 같아야하겠죠?
  2. 메소드의 매개변수의 개수 또는 타입이 달라야합니다.

메소드 오버로딩이 필요한 이유는 무엇일까요??


바로 비슷한 기능을 하는데 이름이 여러개인 메소드를 작성한다면, 소스코드도 길어지고 이름도 여러개가 되어서 헷갈릴 수가 있겠죠??

그럴때 같은 이름의 메소드를 정의하는대신 매개변수들의 차이를 둔다면 훨씬 편하게 사용 할 수 있기 때문입니다.


예를들어 계산기를 작성한다고하면 



int형 계산기, double형 계산기 따로따로 메소드명을 작성한다고하면 얼마나 소스코드가 복잡해질까요?


이럴때 add라는 메소드명 하나로 여러가지의 매개변수를 받을 수 있게 만들면 훨씬 깔끔하게 사용하실 수 있죠?


public class Calculator {
    public void add(int num1, int num2) {
        System.out.println(num1 + num2);
    }
    public void add(double num1, double num2) {
        System.out.println(num1 + num2);
    }
}


바로 이런게 메소드 오버로딩입니다.





다음으로는 생성자에 대하여 알아보도록 하겠습니다.


생성자란?

생성자란 객체를 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화 할수 있도록 호출되는 메소드입니다.


생성자의 특징

생성자 선언시에는 클래스 이름과 동일한 이름으로 메소드를 작성해야합니다.

함수의 반환값도 없으며, 대체로 객체를 초기화 하는 목적으로 사용됩니다.


사용방법

public class Test {
        public Test(){
             System.out.println("생성자다!");
        }

	public static void main(String[] args) {
             Test test = new Test();
	}
}


이런식으로 클래스명과 동일한 이름의 메소드를 선언하여 내용을 작성하셔서 사용하시면됩니다.


그럼 이때까지 이런 생성자를 작성한적이 없는데 문제가 없었느냐? 하면 기본적으로 자바에서는 사용자가 생성자를 작성하지 않는다면,


자동으로 빈생성자를 작성하여 주기 때문에 이때까지 문제가 없었던것입니다.


번외편으로 위에서 배운 매소드 오버로딩은 생성자 생성시에도 적용하여 사용할 수 있습니다.



public class Person {
    String name;
    int age;

    public Person(String newName, int newAge) {
        name = newName;
        age = newAge;
    }

    public Person(String newName) {
        name = newName;
        age = 0;  //기본 나이 지정
    }
}


Person이라는 클래스의 생성자를 매개변수에 따라 2개로 나누어 작성하였습니다.


이런식으로 생성자에서도 메소드 오버로딩 사용이 가능합니다.






다음으로는 this에 대하여 알아보도록 하겠습니다.


this란?

java에서의 this는 어떤것을 가르키는 역할을 하는 것인데, 예시를 들어 확인하는 편이 이해하기 쉬울 것 같아 예시를 들어봤습니다.


public class Person {
    String name;
    int age;

    public Person(String newName, int newAge) {
        name = newName;
        age = newAge;
    }

    public Person(String name) {
        this.name = name;
        age = 0;  //기본 나이 지정
    }
}


바로 위의 생성자 예시를 조금 변형하여 예를 들어 보겠습니다. 


매개변수로 newName, newAge를 받고 있는 Person 생성자와 매개변수로 name을 받고 있는 Person 생성자가 있는데 한부분에 다르시죠??


바로 아래에 있는 Person 생성자는 name이라는 매개변수를 받아 this.name에 값을 넣어주고 있습니다. 아시겠나요??


바로 this란 현재의 인스턴스를 가리키는 역할을 하는 문장입니다. 따라서 같은 변수명이더라도 this를 사용함으로써 자기자신의 변수를 가리킬 수 있기 때문에 소스가 확실히 깔끔해지는 효과를 보실 수 있어요.





지금까지 java의 접근제어자, 메소드 오버로딩, 생성자, this에 대하여 배워보았습니다.


저도 공부를 하면서 생각나는 것들과 배운것들을 정리하기 위하여 작성하는 블로그 글이라 부족한 부분이 많이 있을 수 있습니다.


틀린점이나 궁금한점은 언제든 댓글로 작성부탁드리겠습니다.


감사합니다.


728x90
반응형

댓글