오늘의하루

[JAVA 공부 3일차] 객체지향 Part 1 본문

JAVA

[JAVA 공부 3일차] 객체지향 Part 1

오늘의하루_master 2022. 7. 25. 15:21

객체지향 언어의 특징으로 크게 4가지 있다.

  1. 기존의 프로그래밍 언어와 크게 다르지 않다.
  2. 코드의 재사용성이 높다.
  3. 코드의 관리가 쉬워진다.
  4. 신뢰성 높은 프로그램의 개발이 가능하다.

1. 객체의 구성요소

객체의 구성요소에는 속성(변수)과  기능(메서드)으로 이뤄져 있습니다.

public class Mainclass{
	public static void main(String[] args){
        // 클래스명 참조변수명 = new 클래스명();
        Tv t = new Tv(); // 인스턴스 생성
        t.channel = 7; // 인스턴스 사용
        System.out.println(t.channel); // 7;
    }
}

class Tv{
	// ⭐ 인스턴스 변수
	String color; 
    boolean power; 
    int channel; 
    
    // ⭐ 인스턴스 메소드
    void power() {
    	power = !power;
    }
    void channelUp() {
    	channel++;
    }
    void channelDown() {
    	channel--;
    }
}

2. 참조 변수와 인스턴스의 관계

하나의 참조 변수명은 하나의 인스턴스만을 가질 수 있지만 인스턴스의 경우 여러 개의 참조 변수명이 가리키는 게 가능하다.

public class Mainclass{
	public static void main(String[] args){
        Tv t1 = new Tv(); // t1에 인스턴스 Tv의 주소를 저장한다.
        Tv t2 = new Tv(); // t2에 인스턴스 Tv의 주소를 저장한다.
        
        t2 = t1; // t2에 t1의 주소를 저장한다.
        // ⭐ t2와 t1이 같은 인스턴스를 바라보게 된다.
        t1.channel = 7; 
        System.out.println(t1.channel); // 7
        System.out.println(t2.channel); // 7
    }
}

class Tv{
    int channel; 
    void channelDown() { channel--; }
}

3. 객체의 배열

객체를 배열에 저장하여 사용할 수 있다.

public class Mainclass{
	public static void main(String[] args){
    	Tv[] ArrC = new Tv[3]; // 타입이 Tv인 3칸 짜리 배열을 만든다. 
        
    	for(int i = 0; i < ArrC.length; i++){
    		ArrC[i] = new Tv();
    	}
        ArrC[0].channel = 1; // 0번 인덱스의 channel 값은 1
        ArrC[1].channel = 2; // 1번 인덱스의 channel 값은 2
        ArrC[2].channel = 3; // 2번 인덱스의 channel 값은 3
    }
}

class Tv{
    int channel; 
    void channelDown() { channel--; }
}

4. 선언 위치에 따른 변수 종류

변수의 종류 선언위치 생성시기 비고
클래스 변수(Static 변수) 클래스 영역 실행 시 생성하지 않고 사용 가능
인스턴스 변수 인스턴스 생성시 -
지역변수 메소드 영역 변수 선언문 호출 시 -
public class Myclass{
	public static void main(String[] args){
    	System.out.println(Card.width); // 100;
        // 인스턴스를 생성하지 않았지만 클래스 변수는 사용이 가능하다.
        
        Card a = new Card();
        
        // ⭐ 클래스 변수를 변경하고 싶을때는?
        // 클래스명.클래스변수명 = 변경값;
        Card.width = 150;
        
        // 이렇게도 클래스 변수를 변경할 수 있지만 인스턴스 변수와
        // 구분되지 않기 때문에 💥 사용하지 않는것을 권장한다.
        a.height = 300; 
        
    }
}

class Card{
	// 인스턴스 변수
	String kind;
    int number;
    
    // 클래스 변수(Static 변수)
    static int width = 100;
    static int height = 250;
}

클래스 변수 또는 클래스 메서드의 경우 몇 개의 인스턴스를 생성하더라도 하나만 만들어져서 메모리에 올라가 있는다.

5. 클래스 메서드와 인스턴스 메서드

인스턴스 메서드와 클래스 메서드의 특징에 대해 알아보기

  • 인스턴스 메서드
    • 인스턴스 생성 후 "참조 변수. 메서드 이름()"으로 호출
    • 인스턴스 변수를 메서드 내에서 사용 가능
  • 클래스 메서드(static 메서드)
    • 객체 생성 없이 "클래스 이름. 메서드 이름()"으로 호출
    • 인스턴스 변수와 상관없이 작업 가능하다.
    • 메서드 내에서 인스턴스 변수는 사용 불가능하다.
      • 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려해야 한다.
public class MyClass {
	public static void main(String[] args){
    	System.out.println(Testclass.staticMethod(1,2));
    	
    	Testclass a = new Testclass();
    	a.x = 1;
    	a.y = 1;
    	System.out.println(a.instanceMethod());
    }
}

class Testclass{
	// 인스턴스 변수
    int x; 
    int y; 
    // 클래스 변수(static 변수)
    static int a = 10;
    static int b = 20;
    
    // 인스턴스 메소드
    // ⭐ 인스턴스 메서드에는 클래스 메서드를 사용할 수있다.
    int instanceMethod(){
    	int aa = staticMethod(a, b);
    	return x + y + aa; // 인스턴스 변수를 사용
    }
    
    // 클래스 메소드
    // 💥 클래스 메서드에는 인스턴스 메서드를 사용할 수 없다!
    static int staticMethod(int i, int j){
    	// 💥 인스턴스 변수 사용할 수 없다.
    	return i + j; // i와 j는 지역변수이다.
    }
}

 6. 메서드 오버 로딩(Method overloading)

하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 말한다.

메서드 오버 로딩을 하기 위해서는 3가지 조건을 지켜야 한다.

  1. 메서드의 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 리턴 타입은 오버 로딩을 구현하는데 아무런 영향을 주지 못한다.
public class Myclass{
	public static void main(String[] args){
    	
    }
}
class Testoverloading{
	// 예제1 💥
    // 💥 이건 그냥 코드 중복이다.
    // 2번 조건이 성립되지 않는다.
	int add(int a, int b){
    	return a + b;
    }
    int add(int x, int y){
    	return x + y;
    }
    
    // 예제2 💥
    // 2번 조건이 성립되지 않는다.
    int add(int a, int b){
    	return a + b;
    }
    long add(int a, int b){
    	return (long) a + b;
    }
    
    // 예제3 🧡
    // 모든 조건에 성립된다.
    long add(int a, long b){
    	return a + b;
    }
    long add(long a, int b){
    	return a + b;
    }
    
    // 예제4 🧡
    // 모든 조건에 성립된다.
    int add(int a, int b){
    	return a + b;
    }
    long add (long a, long b){
    	return a + b;
    }
    int add(int[] a){
    	int result = 0;
        for (int i = 0; i < a.length; i++){
        	result = result + a[i];
        }
        return result;
    }
}
Comments