정구리의 우주정복
[JAVA] 객체지향 프로그래밍 (1) 본문
객체지향이란거는 너무 어렵다
1. 객체지향의 장점
1- 코드의 재사용성이 높다
2- 코드의 관리가 용이하다
3- 신뢰성이 높은 프로그래밍을 가능하게 한다
!!처음부터 너무 객체지향에 얽메이지 말고 기능적으로 완성한 후에 어떻게 하면 더 객체지향적이 될 수 있을지 고민해보자!!
2. 클래스와 객체의 정의와 용도
클래스란 "객체를 정의해 놓은 것"
클래스의 용도는 "객체를 생성하는데 사용!"
클래스를 제품 설계도 , TV 설계도 , 붕어빵 기계 라고 한다면
객체는 제품, TV , 붕어빵이다 !!!
3. 객체와 인스턴스
클래스 ---------(인스턴스화) ----------> 인스턴스(객체)
또한 객체는 속성과 기능으로 구성되어있다.
속성은 :크기 , 길이 , 높이 등등등
기능 : 켜기, 끄기 등등등
보통 속성은 "멤버변수"
기능은 "메소드" 라는 표현을 주로 사용한다
class Tv{
String color;
boolean power;
int channel;
void power(){power = !power;}
void channelUp() {channel++;}
void channelDown(){channer--;}
}
간단한 클래스를 선언한 모습이다 위의 3개는 변수 !! 아래 3개는 메소드이다
4. 인스턴스의 생성과 사용
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후 객체의 주소를 참조변수에 저장
Tv t = new Tv();
이런 방식으로 선언해주면 Tv t 에서 참조변수 t 를 선언하고 메모리에 공간이 마련된다
t = new Tv() 이때 메모리의 빈 공간이 만들어지고 t 에는 그 !!주소값!! 이 저장되게 된다
나름 그림을 그려봤다
Tv t1 = new Tv;
Tv t2 = new Tv;
이렇게 인스턴스를 생성하고 t2 = t1 을 하면 t1이 복사가 되는 것이 아니라 t2가 t1 의 주소를 가르키게 되는것이다
따라서 t1의 값이 바뀌면 t2 의 값도 바뀌게 된다.
5. 변수와 메소드
변수에는 클래스변수, 인스턴스 변수, 지역변수 3가지가 있다.
1) 인스턴스 변수 : 클래스 영역에 선언되고 클래스에서 "인스턴스를 생성할때 만들어진다"
2) 클래스 변수 : 인스턴스 변수 앞에 static 을 붙이면 된다 ! 클래스 변수는 한 클래스 안에서 모든 인스턴스들이 공통적인 값을 갖게 된다 !!! 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다. 만약 앞에 public 을 붙이게 되면 전역변수의 성격을 갖게된다
3) 지역 변수 : 메소드 내에서 선언되어 메소드 내에서만 사용되게 된다 while 이나 for 문 블럭 내에 선언된 지역변수는 그 블럭을 벗어나면 소멸되어 사용할 수 없게 된다.
package ch6;
class CardTest {
public static void main(String[] args) {
Card c1 = new Card();
c1.kind = "Heart";
c1.number =10;
Card c2 = new Card();
c2.kind = "Spade";
c2.number = 4;
System.out.println("C1 >>"+c1.kind+" , "+c1.number+
" Width, Height >> "+c1.width+" , "+c1.height);
System.out.println("C2 >>"+c2.kind+" , "+c2.number+
" Width, Height >> "+c2.width+" , "+c2.height);
//클래스 변수의 값을 변경 (모든 인스턴스에게 공통 적용)
Card.width = 200;
Card.height = 300;
System.out.println("C1 >>"+c1.kind+" , "+c1.number+
"Width, Height >> "+c1.width+" , "+c1.height);
System.out.println("C2 >>"+c2.kind+" , "+c2.number+
" Width, Height >> "+c2.width+" , "+c2.height);
}
}
class Card{
//인스턴스 변수(개별적인 값)
String kind;
int number;
//클래스 변수 (고유한 값)
static int width = 100;
static int height = 250;
}
width 와 height 의 값을 같이 변하는 것을 알 수 있다 !
메소드란 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다 !
높은 재사용성 , 중복된 코드의 제거 , 프로그램의 구조화를 위해 사용한다
다른 언어의 함수같은 역할이라고 이해했다
6. 메소드의 선언과 구현
선언하는 방법
반환타입(없다면 void) 메소드이름 (매개변수선언) {
내용 입력
return 결과; (반환타입과 같은 타입이여야함)
}
만약 return 이 없다면 반환 타입에 void 를 넣어주면 된다
메소드 호출시에는
메소드이름(매개변수1,매개변수2. . . ); 이렇게 하면 된다
package ch6;
class MyMathTest {
public static void main(String[] args) {
MyMath mm = new MyMath();
long result1 = mm.add(5L,6L);
long result2 = mm.sub(5L,6L);
long result3 = mm.multi(5L,6L);
double result4 = mm.divide(5L,6L);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
System.out.println(result4);
}
}
class MyMath{
long add(long a,long b){ //메서드의 선언 (메소드는 클래스 안에만 선언 가능하다)
long result = a+b;
return result;
}
long sub(long a,long b) {return a-b;}
long multi(long a,long b) {return a*b;}
double divide(double a,double b){
return a/b;
}
}
7. 클래스 메소드와 인스턴스 메소드
package ch6;
class MyMath2 {
long a,b;
long add(){ //인스턴스 메서드
return a+b; //인스턴스 변수를 사용
}
static long add(long a, long b){ //클래스메서드 (static method)
return a+b; // 지역변수 사용
}
}
class MyMathTest2 {
public static void main(String[] args) {
System.out.println(MyMath2.add(200L,200L)); //클래스 메서드는 별도의 인스턴스 호출 없이 사용 ㅇ
MyMath2 mm = new MyMath2();//인스턴스 생성
mm.a = 200L;
mm.b = 100L;
System.out.println(mm.add());//인스턴스 메서드 호
}
}
클래스 메소드는 static 이 붙어있는 메소드다 이것을 별고의 인스턴스 호출 없이 사용이 가능하다
또한 인스턴스 변수를 사용할 수 없다 !!!!
클래스 메소드 -> 인스턴스 없어도 가능
인스턴스변수 -> 인스턴스 없으면 사용 불가능
따라서 클래스 메소드에서 인스턴스 변수를 사용하려고 하면 인스턴스가 생성되어있지 않은 상황일 수 도 있어서 사용이 불가능하다.
인스턴스 메소드는 mm이라는 새로운 인스턴스를 생성하고 mm.add 라는 방식으로 호출해서 사용해야한다 !
8. 생성자
생성자 : 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드
인스턴스가 생성될 때 실행되어야 할 작업을 위해서도 사용한다.
1. 생성자의 이름은 클래스와 같아야 한다
2. 생성자는 return 이 없다 (하지만 void 를 사용하지 않음)
기본생성자
만약 Card 라는 클래스가 있다면
Card(){ }
이런 아무 내용 없는 기본 생성자는 보통 컴파일러가 자동적으로 추가해준다 (클래스에 정의된 생성자가 하나도 없을때만 컴파일러가 자동적으로 추가해줌)
9. this
package ch6;
class Car2{
String color;
int door;
Car2() {
this("white",4); //this 를 사용해 Car2(String color,int door) 얘를 불러옴
} //빈 생성자로 생성 가능하게끔
Car2(String color,int door){ //생성자 넣고도 만들 수 있게뜸
this.color = color;
this.door =door;
}//this , this() 는 완전 다른거다!!!!
}
public class CarTest2 {
public static void main(String[] args) {
Car2 c1 = new Car2();
Car2 c2 = new Car2("Blue",2);//더욱 간결한 코드가 된다!!!! 따라서 생성자를 만드는게 좋다
System.out.println("C1 >> "+c1.color+" "+c1.door);
System.out.println("C2 >> "+c2.color+" "+c2.door);
}
}
'JAVA > STUDY' 카테고리의 다른 글
[IntelliJ] 단축키 (Mac) (0) | 2023.07.05 |
---|---|
Mac mysql , Workbench download (0) | 2022.02.21 |
[Java 예제 1000제] Simple Quiz 2 - 간단한 다지선다형 문제 (0) | 2022.02.02 |
[Java 예제 1000제] Simple Quiz 1 -간단한 다지선다형 문제 (0) | 2022.02.02 |
[Java 예제 1000제] Word Scramble 4 - 단어 맞추기 (0) | 2022.02.02 |