[JAVA] 추상클래스(abstract)

이미지
JAVA 추상클래스(abstract) 추상 클래스는 상속을 강제하기 위한 것이다. 즉 부모 클래스에는 메소드의 시그니처만 정의해놓고 그 메소드의 실제 동작 방법은 이 메소드를 상속 받은 하위 클래스의 책임으로 위임하고 있다. abstract로 지정되어있는 메서드나 클래스는 직접적으로 사용할 수 없고 반드시 상속을 통해서만 사용할 수 있다. 본체가 있는 메소드는 abstract 키워드를 가질 수 없다. 즉 선언부만 존재해야하며 구현부가 존재하면 사용할 수 없다. 추상메서드의 경우 오버라이딩해서 추상메서드에대한 구체적인 로직을 사용하는 쪽에서 구현해서 사용해야한다. 즉 상속받는 클래스에서 상속받은 선언부를 가지고 구현부를 작성한다. 클래스 내부에 추상메서드가 존재하면 추상메서드를 가지고있는 클래스는 자동적으로 추상클래스가 된다. 추상클래스 내에는 추상 메소드가 아닌 구현부와 선언부가 모두 작성된  메소드가 존재 할 수 있다. 실제 사용법을 보면 공통적으로 사용되는 부분은  일반 메서드로 구현해놓고 상황에따라 달라지는 부분만 추상클래스로 구현해준다. 공통적으로 사용되는 부분은 setOprands로 구현해서 값을 초기화 하도록하고 결과값의 앞에 + 부호 또는 -부호를 상황에따라 다르게 출력하고자 할때와 같은 상황에서 즉 상황에 따라 달라지는 부분은 추상클래스의 추상메소드를 상속받아 구현한다. 추상클래스 단일상속 인터페이스 다중상속

[JAVA] this

이미지
JAVA this java에서의 this는 인스턴스 자신을 가르킨다. 다시말해 java에서의 this는 해당 메소드를 가지고있는 선언한 클래스를 가리킨다. 더 간단히 말하면 나를 생성하거나 호출한 사람을 가리킨다. 사진에서와 같이 this는 전역에 선언된 int v = 10;을 가리키며 v는 m()메서드 안에 선언된 지역변수 int v = 20;을 가리킨다. 만약에 현재 클래스가 부모클래스로부터 상속을 받고있을때 현재클래스 내에서 this는 this가 선언된 클래스를 가리키지만 this.메서드()가 호출되었을때 this가 작성되어있는 클래스 내에 해당 메소드가 존재하지않으면 this는 상속받은 부모클래스를 가리키게되며 부모클래스에서 메서드를 찾아 실행한다.

[JAVA] 다형성(Polymorphism)

이미지
JAVA 다형성(Polymorphism) 다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다. 즉 다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른것을 의미한다. overloading과 다형성 다형성의 쉬운 예로 오버로딩이 있다.  오버로딩은 같은 의미이지만 매개변수가 어떤 형태이고 어떤데이터 타입이냐에 따라서 다른 메서드가 호출되는 방식이다. 즉 같은 이름, 다른 동작방법이라고 볼 수 있기때문에 이것또한 다형성이다. 클래스와 다형성 아래의 코드를 보면 c1과 c2의 인스턴스 데이터타입이 상속받은 부모 클래스인것을 볼 수 있다.  이렇게 작성한 이유는 코드의 중복을 회피하면서도 각각의 인스턴스마다 서로 다른 원하는 결과값을 얻기 위해서이다. 각 인스턴스는 상속받은 상위클래스를 데이터타입으로 정의함으로서  상위클래스에 정의되어있는 setOprands메서드로 인자값을 전달하여 left와 rigth의 값을 초기화하고  각 인스턴스마다 선언된 다른 클래스 즉 각각의 상속받은 하위클래스를 호출하여 서로 다른 원하는 결과값을 출력하도록한다.  상위클래스에서 run메서드로 추상메서드를 호출하고 이렇게 호출된 추상메서드는 상위클래스를 상속받은  각각의 하위클래스에서 오버라이딩을 통해 추상메서드를 구현하여 서로 다른 원하는 결과 값을 출력할 수 있다. 이렇게 작성하는것이 제일 간단하지만 각각의 인스턴스마다 다른 데이터타입을 가지고 있다하더라도  excute메서드에 각각의 데이터타입으로 매개변수를 작성하여 인스턴스의 각각의 데이터를 전달해도 결과값을 동일하게 얻을 수 있다. 하지만 그렇게되면 코드의 중복이 발생하므로 위와같이 작성하는것이 좋을것같다. 인터페이스의 다형성 한 클래스가 여러개의 인터페이스를 상속받는다는것은 상속받은 클래스에서 인터페이스가 구현하는 기능을 모두 사용할 수 있다는것이다. 하지만 모든 기능을 사용하지않고 인터페이스로 구현된 기능중 어떠한 특정 기능만 사용하고자한다면 혹은 해당 기능만 사용하도록 제한하고자

디자인 패턴(design pattern) 이란?

디자인 패턴(design pattern) 프로그래밍에는 반복되는 패턴이 존재한다. 이런 패턴들을 모아서 정리한것을 디자인 패턴이라고 한다. 시각적으로 멋져보이는 디자인이아니라 좋은 소프트웨어를 만들기 위한 설계로서 디자인이라는 표현을 사용한다.  디자인 패턴의 장점은 크게 두 가지이다.  하나는 좋은 설계를 단기간에 학습할 수 있다는 점이다. 다른 하나는 소통에 도움이 된다는 점이다. 설계방법을 토의하거나 전달할 때 설계방법에 따라 적절한 이름이 있다면 상호간에 생각을 일치시키는 데 큰 도움이 될것이다.

[JAVA] final

이미지
JAVA final final은 상속 / 변경을 금지하는 규제다. 값이 한번 정해진 이후에는 변수 내의 값이 바뀌지 않도록하는 규제다. final로 선언된 변수는 값을 재할당 할 수 없다. final로 선언된 메서드는 오버라이딩해서 사용 할 수 없다. final로 선언된 클래스는 상속 할 수 없다.

[JAVA] 오버로딩(overloading) vs 오버라이딩(overriding)

JAVA 오버로딩 vs 오버라이딩 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는것(new) 오버라이딩(overriding) : 재정의 또는 확장. 상속받은 메서드의 내용을 변경(재정의)하는 것(modify) 오버로딩(overloading) (생성자에서 주로 사용) 같은 메소드명으로 여러개의 기능을 만든다. 오버로딩 조건 1.메서드 이름이 같아야한다. 2.매개변수의 갯수 또는 타입이 달라야 한다. 3. 리턴형은 관계없다 오버라이딩(overriding) 상속받은 메서드의 내용을 변경(재정의)하는 것을 오버라이딩이라고 한다. 오버라이딩 조건 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 1. 반드시 상속관계여야 한다. 2. 이름이 같아야 한다.(메소드명이 동일) 3. 매개변수가 같아야 한다.(갯수와 순서, 데이터 타입) 4. 반환타입이 같아야 한다.(리턴형 동일) 5. 접근지정어는 확장, 축소할 수 없다. ( public > protected > default > private ) 오버라이딩은 부모클래스에 정의된 메서드를 상속받지않고 자식클래스에서 재정의하여 사용하는데 상황에 따라 부모클래스에 정의되어있는 메서드의 기본 동작은 그대로 사용하면서 부가적인 기능을 작성하고자 할 때 똑같은 코드를 작성하면 중복이 발생하므로 super.메서드명 으로 기본적으로 작성되어있던 기능을 상속받고 그 후에 추가적으로 변경하고자하는 기능을 추가, 수정 할 수 있다.

[JAVA] 클래스 메서드(static)와 인스턴스 메서드(instance)

JAVA 클래스 메서드(static)와 인스턴스 메서드(instance) 인스턴스 메서드는 클래스 맴버에 접근 할 수 있다. 클래스 메서드는 인스턴스 맴버에 접근 할 수 없다. static키워드와 함께 작성된 변수와 메서드는 static키워드를 사용하지 않는 변수와 메서드에 접근 할 수 없다. 반면에 static키워드 없이 작성된 변수와 메서드는 static변수와 메서드에 접근 할 수 있다. 1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용될 변수와 메서드에 static을 붙인다. 2. 메서드 내에 인스턴스 변수를 사용하지 않으면 static을 사용하는것이 좋다. 3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용 할 수 없다.  4. 클래스 변수(static 변수는) 인스턴스를 생성하지 않아도 사용할 수 있다. 5. static메서드는 static변수 사용 가능 6. 인스턴스 메서드와 변수의 경우 new연산자로 메모리 할당시에만 사용가능하지만 클래스 메서드(static 메서드는) new연산자로 메모리 할당없이 사용가능. 컴파일과정에서 메모리 자동생성. 7. static메서드에서는 this 사용이 불가능하다. 하지만 new 연산자로 static메서드 안에 메모리를 할당하면 this 사용이 가능하다.

JVM 메모리 구조

JVM 메모리 구조 응용프로그램이 실행되면 JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.  그 중 3가지 주요 영역에는 method area, call stack, heap이 있다. 1. 메서드 영역(method area) 프로그램 실행 중 어떤 클래스가 사용되면 JVM은 해당 클래스의 클래스파일을 읽어서 분석하여 클래스에 대한 정보를 이곳에 저장한다. 이 때 클래스의 클래스 변수도 이 영역에 함께 생성된다. 2.힙(heap) 인스턴스가 생성되는 공간이다. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉 인스턴스 변수들이 생성되는 공간이며 사용자 정의 데이터가 저장되는 공간이다. 3.호출스택(call stack) 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당되며 해당 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수포함)들과 연산의 중간 결과등을 저장하는데 사용된다. 그리고 메서드가 작업을 종료하면 할당되었던 메모리 공간은 반환된다. - 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다. - 메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다. - 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드이다. - 바로 아래있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

[JAVA] 변수 초기화 및 조건문 오류

이미지
JAVA 변수 초기화 및 조건문 오류 값이 초기화 되지않았다는 오류가 발생하였다. 원인은 if만을 사용해서 조건문을 작성하였기 때문이다. if조건에 해당하면 결과값으로  score에 등급을 대입하지만 모든조건이 일치하지않을경우 조건문을 실행하지 않으므로 값이 할당되지 않아 값이 초기화 되지않았다는 오류를 발생한다. 이런경우 score에 값을 직접 임의로 작성해주던지 아니면 if ~ else문으로 작성하면 if조건문에 조건이 충족되지 않더라도 else문을 실행하면서 score값에 값을 할당하기 때문에 코드가 오류없이 정상적으로 작동한다.

[JAVA] 출력방법 pintln, print, printf

JAVA 화면출력 println ( 세로 출력 ) System.out.println("hello"); System.out.println("java"); hello java print ( 가로 출력 ) System.out.print("hello"); System.out.print("java"); hello java printf ( 서식이 있는 출력 ) %d => 정수 %f => 실수 %c => 문자 %s => 문자열 % 와 알파벳 사이의 숫자는 출력값의 간격 및 정렬 양수면 오른쪽 정렬(왼쪽칸 띄움)   ex) %5d 음수면 왼쪽 정렬(오른쪽칸 띄움)    ex) %-5d 0은 공백 0으로 출력    ex) %05d System.out.println("80 80 80 240 80.0 B"); System.out.printf("%5d%5d%5d%5d%5f%5c", 80, 80, 80, 240, 80.0, 'b'); 위 두줄은 결과값을 똑같이 출력한다. 첫번째 인자로 각 데이터에 대한 데이터타입과 간격등을 직접 입력하여 원하는데로 값을 출력할 수 있다. %는 데이터를 받는다는 것이고 숫자5는 각데이터의 간격 d, f, c 등은 해당부분에 들어오는 데이터 타입을 나타낸다. ---------------------------------------------------------------------------------------------------- System.out.printf("%12.2f", 80.55); 여기서 12의 경우 해당 값이 표현될 수 있는 총 자릿수 12자리를 의미한다. 여기서 .2의 경우 소수점 2자리까지 나타내준다는의미를 가지고있으며 출력값은 80.55이다 만약에 여기서 .1로 변경할 경우 소수점 1자리까지 나타내준다는 의미로 반올림되어 출력값이 80.6이 출력된다. ----------