A Java program is a pile of classes
자바는 클래스들의 파일집합체이다
상속,오버라이드(@override)
오버라이드란 ?
부모 클래스의 메소드를 사용할 수 있어도 자식 클래스에서 변경해야 할 상황이 발생한다면 오버라이드를 통해 자식 클래스에서만 새로운 기능으로 재정의
public abstract class Shape{
public void rotate(){
System.out.println("빙글빙글")
}
public void playsound(){
System.out.println("도형에 맞는 소리를 내어요");
}
여기서 Shape는 최상위 클래스이며 상속하는 내용들 뿐이기에 추상적인 클래스가 되게된다.
그래서 abstract를 써야한다.
그럼, 여기서 playsound()메소드의 내용을 빼버린다면 어떻게 될까?
ex)
public abstract class Shape{
public void rotate(){
System.out.println("빙글빙글")
}
public void playsound()
Ecplise뷰에서 public void playsound()의 playsound()에 밑줄이 생기게 된다.
이유는 내용이 사라졌기 때문에 추상적인 메소드가 됐기 때문이다
그러므로 위와 같은 상황에선
public abstract class Shape{
public void rotate(){
System.out.println("빙글빙글")
}
public abstract void playsound(){
System.out.println("도형에 맞는 소리를 내어요");
}
이렇게 쓰는것이 맞다.
그러나 위와같이 메소드에 abstract처리를 하면 상속받고 있는 하위 클래스들에 빨간줄이 생긴다.
ex)
Public class Circle extends Shape{
}
어떻게 해야할까?
위와 같은 상황에선 상위클래스의 메소드를 오버라이드해서 가져오면 된다.
Public class Circle extends Shape{
@Override
public void playsound(){
}
}
변수의 데이터타입,자료형
int x=24;
byte b=x;
위의 코드를 실행시 컴파일에러가 뜬다.
이유는 큰그릇(4byte의 int)을 작은그릇(1byte)에 넣어주기 때문이다.
그러나 반대로하면 어떨까?
byte x=125
int z=x;
위에선 작은그릇에서 큰그릇으로 자동변환 되기때문에 컴파일에러가 발생하지 않는다.
이러한 현상을 업캐스팅(UpCasting)이라고 부른다.
여기서 primitive 타입에 관해 짚고 넘어간다. (이것은자바다 p.38 참조)
데이터타입에 따른 분류
기본(primitive)타입: 정수, 실수 , 문자 , 논리 리터럴을 직접 저장하는 타입
리터럴이란? 소스 코드의 고정된 값을 대표하는 용어
정수타입은 byte,short,int,long이 있고, 실수 타입은 float,double이 있다.또한 논리타입에는 boolean이 있다.
참조(Reference)타입: 값이나 형식이 저장되어 있는 주소값을 값으로 가짐
ex)String,배열 등등
선언 위치에 따른 분류
멤버변수 : 클래스 영억에 선언된 변수.
-클래스변수 : 앞에 static이 붙은 변수, 값을 공유하는 변수
-인스턴스변수 : 각각의 인스턴스마다 다른 값을 가져야 할 때 사용
지역변수(로컬변수):메서드 내에서 선언된 변수
메서드 내에서만 사용가능
생성자
public class Dog {
String name;
public static void main(String[] args) {
Dog dog1=new Dog();
dog1.bark();
dog1.name="Bart";
Dog[] myDogs=new Dog[3];
myDogs[0]=new Dog();
myDogs[1]=new Dog();
myDogs[2]=dog1;
myDogs[0].name="Fred";
myDogs[1].name="Marge";
System.out.print("last dog's name is ");
System.out.println(myDogs[2].name);
inx x=0;
while(x<myDogs.length) {
myDogs[x].bark();
x=x+1;
}
}
public void bark() {
System.out.println(name + " says Ruff!");
}
위에서 이해가 안됐던 코드들을 살펴보자.
Dog dog1=new Dog();
dog1이라는 이름으로 Dog클래스를 참조하여 객체를 생성한다는 뜻이다.
여기서 중요한점은 =를 기준으로 왼쪽과 오른쪽 값의 타입이 같아야 한다.
즉, 좌변의 Dog과 우변의 Dog()는 타입을 맞추기 위해 동일하게 작성한다.
위의 코드에서 배열형식도 같은맥락이라고 볼수있다.
Dog[] myDogs=new Dog[3]
그렇다면,
myDogs[0]=new Dog();
myDogs[1]=new Dog();
myDogs[2]=dog1;
이것은 myDogs 배열에 각각 객체를 넣어준다는 것이다.
myDogs[2]는 dog1를 넣어주는 것이니, 위에서 정의했던 "Bart"가 된다.
그렇다면 정수형의 경우는?
int[] myDogs=new int[3]
위와같은 형식으로 만들면 된다.
getters and setters
get,set을 쓰는이유는 HeadFirstJAVA책에서 고양이로 예시하고있는 내용을 근거로 설명한다.
참조변수 theCat을 사용하여 Main클래스에서 theCat.height=27;이라고 가정했을때, 고양이의 키는 27이 된다.
그러나 누군가가 theCat.height=0; 이라고 수정해버리면 고양이의 키는0이 되어버린다.
이는 상식적으로 말이되지않는다. 심지어 음수까지 가능하다.
이런 상황이 나오지않게 미리 get에서 고양이의 키를 정의해준다.
public void setHeight(int ht) {
if(ht>9) {
height = ht;
}
이러면 고양이의 키는 9미만이 될수없으므로 좀더 객체화된다.
Get,Set을 쓰는이유중 다른 하나는 접근제어가 private로된 변수를 쓰기위해서도 있다.
보통 instance변수는 private로 설정해준다. 그렇다면 getters and setters는 당연히 public이 되어야
Main에 가져올수있으니 public으로 설정해준다.
instance variable -> private
getters and setters method -> public
다음과 같은 서브클래스가 있을때 메인클래스의 틀린예시와 맞는예시를 알아보자
public class ElectricGuitar{
private String brand;
public void setbrand(String amu){
brand=amu;
}
public String getbrand() {
return brand;
}
틀린예시
ElectricGuitar g=new ElectricGuitar();
g.brand="야마하";
String a=g.brand;
System.out.println(a);
맞는예시
ElectricGuitar g=new ElectricGuitar();
g.setBrand("야마하");
String b=g.getBrand();
System.out.println(b);
위의 코드가 겟터와셋터를 이용한 맞는 코드라고 볼수있다.
근데, 개인적으로 궁금한 부분이 생겨서 set안에 모든코드를 넣어봤다.
ElectricGuitar g=new ElectricGuitar();
String c=g.setBrand("야마하")
System.out.println(c);
이렇게 써도 답은 나오나 겟터셋터로 좀더 정형화되고 프로그래머들간의 약속이기에 겟터와셋터는 필수적으로 형식을 지켜준다.
(22/12/23 잘못된 내용 수정)
코드가 길어지면? ctrl+shift+s를눌러 겟터와셋터를 바로 생성해주는 탭을 이용한다
'인공지능 교육 > Java' 카테고리의 다른 글
21/05/05 8일차 인공지능 교육 (0) | 2021.05.08 |
---|---|
21/05/04 7일차 인공지능 교육 (0) | 2021.05.06 |
21/05/04 6일차 인공지능 교육 (0) | 2021.05.04 |
21/05/03 5일차 인공지능 교육 (0) | 2021.05.03 |