ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바기초] 객체지향 프로그래밍 정의 및 특징(은닉성) 정리노트
    º Language º/Java 2023. 3. 20. 20:24

    자바는 객체 지향 프로그래밍 언어라고 합니다.

    그렇다면, 객체 지향 프로그래밍 언어는 무엇일까요?

     

    * 객체란?

     

    - 현실 세계의 모든 것은 객체화 할 수 있습니다.

    현실 세계은 눈에 보이는 것일 수도 있고 눈에 보이지 않는 추상적인 것일 수도 있어요.

     

    - 이 세상을 구성하고 있는 모든 것이 "객체"입니다. 수 많은 객체들로 구성되어 있지요.

    예를 들어, 책상에 놓여 있는 컴퓨터, 마우스, 키보드, 연필 등 모두 "객체"입니다.

     

    - 객체는 이 세상에서 유일하며 객체 자신을 구성하기 위한 고유한 속성동작들로 구성이 되어있어요.

    마우스를 대신하여 연필을 사용할 수 없겠죠? 자신이 가진 고유한 속성과 동작을 사용해야 하니까요.

     

     

    * 객체 지향 프로그래밍이란?

     

    - 자바로 객체 지향 프로그래밍을 할 때에는 내가 표현해야 할 객체를 위한 속성과 동작을 분석하여 클래스를 만들어요.

     

    - 더 쉽게 예를 들어보죠, 겨울에 길거리에 붕어빵 장수 들이 사용하는 붕어빵을 굽기 위하여 사용하는 붕어빵 틀"클래스"에 해당되고 그 붕어빵 틀에 의하여 구워진 붕어빵 하나 하나가 "객체"에 해당됩니다.

     

    - 자동차 제조업체에서 자동차를 만들기 전에 먼저 설계도를 만들어요.
    설계도의 의해서 설계도대로 자동차를 만듭니다.
    설계도에 해당하는 것이 "클래스"이며 그 설계도에 의해 만들어진 자동차들이 "객체"입니다.

     

     

    -  자바에서는 객체의 고유한 속성과 동작을 이렇게 표현해요.

    속성 - > 맴버 변수

    동작 - > 맴버 메소드

     

     

     

    *  객체 지향 프로그래밍 언어의 기본 방식

    class 클래스이름{
    	맴버 변수 (들)
    	맴버 메소드(들)
    }
     

     

     

    Person 이라는 클래스 이름으로 예시를 하나 들어보겠습니다.

    사람 Person
    	속성
    		이름	String name="홍길동";
    		나이	int age=20;
    
    	동작
    		먹는다	eat(String food)
    		잔다	sleep()
    > 위 코드와 같이 사람의 이름/나이와 같은 고유한 속성을 맴버 변수로 표현하고, 먹는다/잔다 와 같은 동작을 맴버메소드로 표현합니다.

     

     

     

    * 객체 지향 프로그래밍의 특징

     

    객체 지향 프로그래밍의 특징 중 은닉성(Encapsulation)에 대해 먼저 알아보겠습니다.

     

    1. 은닉성(Encapsulation)

     

    - 속성(맴버변수)들을 클래스 외부로 부터 보호하는 것입니다.

     

    - 그러나, 모든 것들을 "보호"하게 되면 외부에서 이 클래스를 사용을 못해요.

    그래서 "접근명시자"를 이용합니다. 어떤 것은 접근할 수 있고, 어떤 것을 접근을 못해요.

     

    * 접근명시자

    private : 전용부
    ==> 외부의 다른 클래스로 부터 맴버를 보호합니다.

    public : 공용부
    ==> 외부의 다른 클래스들오 맴버에 접근할 수 있어요.

     

     

    * setter와 getter

     

    - private 영역의 맴버변수의 값을 수정하기 위한 메소드와 읽어오기 위한 메소드를 말합니다.

    - setter : 맴버변수의 값을 수정하기 위한 메소드

    - getter :  읽어오기 위한 메소드

     

    - 일반적으로 클래스를 만들 때 맴버변수들은 private 영역에 두어 속성(맴버변수)들을 보호하고,

    public에 있는 setter getter를 통해서 맴버메소드들은 접근을 허용하도록 만들어요

     

     

     

    * 생성자란?

     

    - 클래스이름과 같은 이름의 메소드를 말하며 객체 생성시에 자동으로 수행하여

    맴버변수()의 값을 초기화 할 목적으로 사용하는 특수한 메소드입니다.

     

    - 일반 다른 메소드는 호출문에 의해서 동작하고 메소드가 끝나는 호출한 곳으로 return개념이 있습니다.

    그러나, 생성자는 호출문에 의해서 동작하는 것이 아니라 객체 생성시에 자동 수행하기 때문에 return의 개념이 없어요.

     

    그러니까 생성자 메소드 앞에 return타입을 아무것도 쓰지 않아야 합니다.

    void 또한 리턴하는데 리턴값이 없다는 소리이기 때문에 이것도 쓰는 것이 아닙니다.

     

    public Person(String name, int age){
    		this.name = name;
    		this.age = age;
    	}

    > 위 코드를 보면 public 이외의 아무것도 쓰지 않았습니다. 생성자를 사용할 때에는 이렇게 사용됩니다.

     

     

     

    * 생성자의 중복

     

    - 필요하다면 생성자를 중복하여 여러개 만들 수 있어요.

     

    그렇게 위해서는 매개변수의 개수가 다르거나 자료형이 달라야 합니다.

     

    class Person{
    	private String name;
    	private int age;
    	public Person(String name, int age){
    		this.name = name;
    		this.age = age;
    	}
    	public Person(){		// 매개변수로 값을 넣지 않음.
    		this.name = "홍길동";
    		this.age = 20;
    	}
    	public Person(String name){	// 매개변수로 자료형 String 값만 넣어둠.
    		this.name = name;
    		this.age = 20;
    	}
    	public Person(int age){		// 매개변수로 자료형 int 값만 넣어둠.
    		this.name = "홍길동";
    		this.age = age;
    	}
    	public void info(){
    		System.out.println("이름:"+name+",나이:"+age);
    	}
    }
    class PersonTest07 {
    	public static void main(String[] args) {
    		Person p1 = new Person("김유신",30);
    		Person p2 = new Person();
    		Person p3 = new Person("김유신");
    		Person p4 = new Person(30);
    		p1.info();
    		p2.info();
    		p3.info();
    		p4.info();
    	}
    }

     

     

    기본 생성자 

     

    - 매개 변수를 하나도 갖지 않는 생성자를 말합니다. 

    자바는 사용자가 생성자를 하나도 만들지 않으면 자동으로 기본 생성자를 제공합니다.

     

    - 그러나 만약 사용자가 생성자를 하나라도 만들기 시작하면 더이상 기본 생성자를 제공하지 않습니다.

    필요하다면 기본 생성자를 만들어 주어야 합니다.

    class Person {
    
        public Person (){
    
        }
        
    }

     

     

     

    * this 키워드

     

    - 생성자맴버메소드에서 매개변수이름을 의미 있는 이름으로 정해 주다 보면 맴버변수이름과 동일하게 되는 경우가 많습니다. 이때에 맴버 변수 자신을 구별할 목적으로 this를 사용합니다.

     

    class Person{
    	private String name;
    	private int age;
    	public Person(String name, int age){
    		this.name = name;
    		this.age = age;
    	}
    > 위와 같은 코드를 보면 맴버 변수에 String name; int age;의 이름으로 되어있습니다.
    아래 ( ) 안의 매개 변수 또한 이름이 같습니다.
    이럴 때에 맴버 변수는 this.name 과같이 처리하고 매개 변수 = name은 그대로 써줍니다.

     

     

    * this 와 this()

     

    - this 는 위에서 말한 것과 같이 생성자나 맴버 메소드 안에서 맴버 변수 자신을 구별할 목적으로 사용되었습니다.

     

    - this() 는 생성자가 중복정의 되어있을 때에 생성자 안에서 또 다른 생성자를 동작시킬 때에 사용됩니다.

    this()는 항상 생성자 안에서 첫번 째 문장에 와야 합니다.

     

     

     

     * 클래스 변수( static 변수, 정적변수)

     

    클래스를 구성하고 있는 맴버변수들은 객체를 생성해야만 메모리가 확보됩니다.

    또한 객체마다 별도의 메모리가 생성됩니다.

    그런데.. 만약 모든 객체가 공동으로 사용할 메모리 공간이 필요하거나, 객체 없이도 사용할 메모리 공간이 필요하다면 어떻게 해야할까요?

     

    맞아요. 그럴때 클래스 변수를 사용합니다!

     

     

    * 클래스 변수의 사용 방법

     

    - 맴버 변수 이름 왼쪽에 static 키워드를 붙입니다.

    - static을 붙이면 "클래스 변수"가 되며 객체와 무관하게 객체 없이도 사용할 수 있고, 객체가 있다면 모든 객체가 공동으로 사용할 수 있는 변수가 됩니다.

     

    - 객체 없이 사용해야 하기에 클래스 이름으로 접근하게 됩니다.

     

    class Person{
    
    	public static void pro(){
    		System.out.println("pro입니다.");
    	}
    }
    
    class StaticMethodTest {
    	public static void main(String[] args) {
    		Person.pro();	//객체가 없기에 클래스이름으로 클래스메소드호출
        }
    }

    > 위 코드를 보면 static이 사용 된 pro 클래스메소드를 Person 클래스 이름으로 호출하고 있는 것을 확인할 수 있습니다.

     

     

     

     * 클래스 메소드

     

    클래스 메소드 또한 클래스 변수와 같은 원리 입니다.

    일반 맴버 메소드들은 객체를 생성하고 객체를 통하여 호출할 수 있어요.

    그러나, 객체와 무관하게 호출하고자 하는 메소드가 있다면 static 키워드를 붙여서 클래스 메소드로 만들어 사용합니다.

     

    - 또한, 클래스 메소드 안에서는 클래스 맴버에만 접근할 수 있어요.

     

    class Person{
    
    	String name;  //맴버변수
            public static int people;  // 클래스변수
        
    	public Person(String name){  //생성자
    		this.name = name;
            people++;	// 객체가 생성될 때마다 클래스변수를 1개씩 증가
            			// 즉, 사람의 인원 수를 구할 수 있음.
    	}
        
    	public static void pro(){  //클래스메소드
    		System.out.println("pro입니다.");
    	}
        
    	public void sayHello(){  // 맴버메소드
    		System.out.println("hello, "+name);
    	}
    }
    
    class StaticMethodTest {
    	public static void main(String[] args) {
        
    	Person.pro();  // 클래스이름, 클래스메소드를 호출o
            
            Person.sayHello();  //클래스메소드가 아니라서 호출x
            
    	Person p = new Person("tiger");
    	p.sayHello();  // 맴버메소드는 객체를 이용하여 호출o
            
            System.out.println("사람 인원 수 : " + Person.people);
        }
    }

    >  위와 같이 맴버 변수는 맴버 메소드에만 사용될 수 있고, 클래스 변수는 클래스 메소드에만 사용이 가능합니다.

     

     

     

     * 메소드의 중복 (overloading)
     

    - 같은 이름의 메소드를 중복하여 정의할 수도 있어요. 그렇게 하기 위해서는 매개변수의 개수가 다르거나 자료형이 달라야 합니다.

    public int getMax(int a, int b){	// int 자료형2개
    
    }
    
    public double getMax(double a, double b){	//double 자료형 2개
    
    }
    
    public double getMax(double a, double b, double c){ //double 자료형 3개
    
    }
    
    public int getMax(int []a){	//int자료형 1개
    
    }

    > 위 코드 처럼 매개변수의 자료형이 서로 다르거나, 매개 변수의 개수가 다를 때에만 중복이 허용됩니다.

     

     

     

    연습)

    ** private에 대하여 설명하시오

     

    ** 생성자에 대하여 설명하시오.

     

    ** 클래스변수와 클래스메소드에 대하여 설명하시오.

     

    ** 메소드중복에 대하여 설명하시오.

     

    ** thisthis()에 대하여 설명하시오.

     
Coder yein