ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바기초개념 다시잡기 자바의정석 - 객체지향
    자바 기초 2021. 7. 22. 20:34

    남궁성님의 자바의 정석 - 기초편 유투브 참조!

     

    1. 객체지향(OOP - Obejct Oriented Programming)

    • 객체지향을 알면 자바에 대해서 절반은 안다고 봐도 좋다
    • 절차적 프로그래밍에서 객체지향의 프로그래밍으로 80년대 초부터 발전함
    • 객체지향 = 재사용성이 높고, 유지보수 용이 및 중복코드제거에 탁월
    • 객체지향의 핵심은 슐화/속/상화/다형성

     

    2. 클래스와 객체

    • 클래스 - 객체를 정의해 놓은것 (설계도) --> 객체를 생성하는데 사용
    • 객체 - 클래스를 바탕으로 존재하는 것(제품/개념등) --> 객체가 가지고 있는 기능과 속성을 정의한 것
    • 객체는 속성(변수) + 기능(메서드) 로 이루어짐 
    • 객체와 인스턴트는 같은 말. 객체는 인스턴스를 대표하는 일반적 용어 
    • 인스턴스는 클래스로부터 생성된 객체 (Class Tv --> Tv tv = new Tv())

    • 클래스 -> 객체정의 -> 인스턴스화 -> 인스턴스(객체), 즉 클래스를 정의하고 사용하려면 인스턴스를 만들어야함
    • 클래스는 왜 필요해요? -> 객체를 생성하기 위해
    • 객체가 왜 필요해요 -> 객체를 사용하기 위해
    • 객체를 사용한다는 것은? 그 객체의 속성(변수)/기능(메서드)를 사용하는 것. 
    class Tv { //1) 클래스(설계도) 생성
    	String color;
    	boolean power;
    	int channel;
    	
    	void power() {power = !power;}
    	void channelUp() {++channel;}
    	void channelDown() {--channel;}
    }
    
    public class Ex_1 {
    	public static void main(String[] args) {
    		Tv t = new Tv();  //2) 클래스 기반 객체 생성
    		t.channel = 12; //3) 객체 사용
    		t.channelDown();
    		System.out.println("Current channel: " + t.channel);
    		t.power = true;
    		System.out.println("The tv is on: " + t.power);
    		t.color = "Green";
    		System.out.println("The TV's color is: " + t.color);
    	}
    }
    
    //4) 객체 사용 결과
    Current channel: 11 
    The tv is on: true
    The TV's color is: Green

     

     

    3. 클래스 개념

    • 클래스는 1) 설계도 2) 데이터+함수 3) 사용자 정의 타입으로 정의 할 수 있다
    • 데이터(변수) + 함수로 클래스를 생성 한다
    • 사용자 정의 타입이란 개발자가 직접 원하는 타입을 만들 수 있다
    class Time {
    	int hour;
    	int minute;
    	int second;
    }
    public class Ex_2 {
    	public static void main(String[] args) {
    		//객체지향없이 하드코드시에는 일일이 값을 바꿔줘야한다
    		int hour = 12;
    		int minute = 33;
    		int second = 22;
    		
    		//클래스로 정의하고 객체화해서 필요할때마다 불러서 쉽게 변경 가능
    		Time t = new Time();
    		t.hour = 13;
    		t.minute = 32;
    		t.second = 55;
    	}
    }

     

     

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

    • 객체지향을 바탕으로 만들어진 클래스는 변수를 클래스영역과 메소드 영역으로 구분해서 가진다
    • 클래스 내부에서는 변수선언/메소드선언만 된다
    • 인스턴스변수는 개별적 부분에, 클래스변수는 공통으로 들어가야하는 부분에서 선언

    • 메서드(함수)의 역할은 코드중복을 줄이고 메서드 하나를 선언해놓으면 어디에서든지 편하게 호출해서 쓸수있다
    • 메서드의 반환타입은 반드시 리턴이나 결과값과 같도록 지정해야한다. 
    • 하나의 메서드는 한가지 기능만 수행하도록 작성해야한다. (메서드는 선언부 + 구현부로 구현)

    ( ) 에는 매개변수(함수를 통해 입력되는 값)가 들어간다!

    class cal {
    	public void gugudan(int a) { //입력받아 함수를 진행할 값
    		for (int i=1; i<10; i++) {
    			System.out.println(a+": " + a + " * " + i + " = " + (a*i));
    		}
    	}
    }
    public class Ex_3 {
    	public static void main(String[] args) {
    		cal a = new cal();
    		a.gugudan(3); // 함수에 들어갈 값
    	}
    }
    3: 3 * 1 = 3
    3: 3 * 2 = 6
    3: 3 * 3 = 9
    ....
    
    class myMath {
    	public int max(int a, int b) {
    		return a > b ? a : b;
    	}
    }
    public class Ex_4 {
    	public static void main(String[] args) {
    		myMath a = new myMath();
    		System.out.println(a.max(4, 5));
    	}
    }
    5

     

    5. return문

    • 실행중인 메서드를 종료하고 호출한 곳으로 되돌아가거나 또는 함수의 기능안의 결과를 리턴한다 
    • 반환타입이 void이면 return 생략 가능, 아니면 반드시 return 필요

     

    6. 기본형/참조형 매개변수

    • 기본형은 읽기만 가능, 참조형은 읽고 변경 가능
    • 기본형은 부여된 값(readOnly)을 주고 참조형은 객체가 들고있는 주소(read/write)를 준다고 생각하자
    • 참조형이 리턴이되면 그 참조형의 주소가 반환 된다.
    class Data {int x;}
    public class Ex_5 {
    	public static void main(String[] args) {
    		Data d = new Data();
    		d.x = 10;
    		System.out.println("d.x = " + d.x);
    		change(d.x);
    		System.out.println("==메소드종료==");
    		System.out.println("d.x = " + d.x);
    
    	}
    
    	static void change(int x) { //기본형
    		x = 1000;
    		System.out.println("change's x = " + x);
    	}
    }
    d.x = 10
    change x = 1000
    ==메소드종료==
    d.x = 10
    
    
    class Data {int x;}
    public class Ex_5 {
    	public static void main(String[] args) {
    		Data d = new Data();
    		d.x = 10;
    		System.out.println("d.x = " + d.x);
    		change(d);
    		System.out.println("==메소드종료==");
    		System.out.println("d.x = " + d.x);
    
    	}
    
    	static void change(Data d) { //매개형
    		d.x = 1000;
    		System.out.println("change's x = " + d.x);
    	}
    }
    d.x = 10
    change x = 1000
    ==메소드종료==
    d.x = 1000

     

     

     

    7. 오버로딩(overloading)

    • 한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것 (대표 예: println)
    • 오버로딩 조건 1)메서드 이름 통일 2)매개변수의 개수 또는 타입이 달라야함 3)반환타입은 상관없음
    class Calculator {
    	int add(int a, int b) {
    		return a + b;
    	}
    	long add(int a, long b) {
    		return (long)(a + b);
    	}
    }
    public class Ex_7 {
    	public static void main(String[] args) {
    		Calculator a = new Calculator();
    		System.out.println(a.add(3, 5));
    		System.out.println(a.add(3, 5L));
    	}
    }
    
    8
    8

     

    8. 생성자

    • 인스턴스(객체)가 생성될 때 마다 호출되는 '인스턴스 초기화 메서드'
    • 이 인스턴스 초기화 메서드에 초기값을 세팅해놓으면  인스턴스(객체생성)하면 그 초기화값으로 항상 시작됨
    • 생성자의 이름은 반드시 클래스 이름과 같아야 한다(생성자도 오버로딩의 개념)
    • 생성자는 리턴값이 없다, 즉 대입문이다. (void 필요 없음)

    모든 클래스는 반드시 생성자를 가져야한다 (생성자를 따로 만들지 않아도 클래스 생성시 자바컴파일에서 자동으로 하나(기본생성자=매게변수가없는 생성자(클래스이름() {})를 가지고 있다)

    매개변수가 없으면 안의 내용으로 초기화

    class Car{
    	String color;
    	String gear;
    	int door;
    	public Car(String c, String g, int d) {
    		color = c;
    		gear = g;
    		door = d;
    	}
    	
    }
    public class Ex_8 {
    	public static void main(String[] args) {
    		Car c = new Car("green", "auto", 4);
    		System.out.println("Color: " + c.color + " Gear: " + c.gear + " Door: " + c.door);
    	}
    }
    Color: green Gear: auto Door: 4

    8-1 생성자 this / 참조변수 this

    • 생성자에서 다른 생성자 호출할때 사용 (코드 중복 제거)
    • 생성자 this는 항상 첫줄에서만 호출
    • 참조변수 this는 자신을 가리키는 인스턴스용 참조변수를 말함. 지역변수와 인스턴스변수를 구별할때 사용
    class A {
    	int x, y;
    	public A(int x, int y) { //2) 그 매개변수의 값이 곧 지역변수에 들어가고
    		this.x = x; //3) 그 지역변수 값이 이 매개변수에 전환된다면서 항상 이 기능과 값으로 초기화
    		this.y = y;
    		System.out.println("x, y = " + x + "," + y);
    	}
    }
    public class Ex_9 {
    	public static void main(String[] args) {
    		//1) 클래스를 인스턴스(객체)화 하면서 매개변수 값을 넣고
    		//   생성자가 있으므로 항상 생정자가 가진 기능으로 초기화
    		A a = new A(5, 6); 
    		
    		//기본생성자의 값을 바꿀수도있다. 
    		a.x = 10;
    		a.y = 20;
    		System.out.println("a.x, a.y = " + a.x + ", " + a.y);
    	}
    }
    x, y = 5,6
    a.x, a.y = 10, 20

    8-2 변수의 초기화

    • 지역변수는 수동 초기화를 사용전에 꼭 해야한다. 
    • 멤버변수는 자동 초기화가 된다.
      초기화란 변수에 값을 줘서 사용 가능하도록 만들어야한다는 뜻
    • 멤버변수 초기화 방법 1)명시적(=) 20 2)초기화 블럭({}) - 거의 안씀 3)생성자
    • 클래스 변수 초기화 시점은 클래스가 처음 로딩될때 단 한번
    • 인스턴스 변수 초기화 시점은 인스턴스가 생성될때 마다
Designed by Tistory.