-
자바기초개념 다시잡기 자바의정석 - 객체지향자바 기초 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)생성자
- 클래스 변수 초기화 시점은 클래스가 처음 로딩될때 단 한번
- 인스턴스 변수 초기화 시점은 인스턴스가 생성될때 마다
'자바 기초' 카테고리의 다른 글
자바기초개념 다시잡기 자바의정석 - 연습문제 6장 (0) 2021.07.26 자바기초개념 다시잡기 자바의정석 - 연습문제 5장 (0) 2021.07.24 자바기초개념 다시잡기 자바의정석 - 연습문제 4장 (0) 2021.07.23 자바기초개념 다시잡기 자바의정석 - 연산자/조건문/반복문/배열/스트링 (0) 2021.07.20 자바기초개념 다시잡기 자바의정석 - 변수 (0) 2021.07.20