문자열 비교시 == 비교연산자는 주소의 값을 비교한다.

equals라는 메소드를 사용하면 순수 데이터 값만을 비교할 수 있다.

https://limkydev.tistory.com/139

 

[String] == VS equals 문자열 비교

== VS equals 문자열 비교 안녕하세요. Limky 입니다. 오랜만에 글쓰네요~ 오늘은 기본적인 java 문자열 비교에 대한 흔한 실수를 알아보고 올바른 문자열 비교가 무엇인지 알아보겠습니다. 자바에서

limkydev.tistory.com

 

 

※ javascript는 == (동등연산자)로 문자열을 비교한다.

'Backend > Java' 카테고리의 다른 글

servlet  (0) 2022.11.15
Java 제네릭  (0) 2022.11.14
Java 예외처리  (0) 2022.11.10
Java 인터페이스(interface)  (0) 2022.11.09
Java 추상 클래스  (4) 2022.11.08

https://mangkyu.tistory.com/14

 

[JSP] 서블릿(Servlet)이란?

1. Servlet(서블릿) 서블릿을 한 줄로 정의하자면 아래와 같습니다. 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 간단히 말해서,

mangkyu.tistory.com

이해하기 쉬웠던 내용의 게시글

 

 

servlet : 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램

jsp : html안에 java프로그램 

http servlet 인터넷 통신을하기위한 자바에서 만든 프로그램

서버 서비스를 제공하는 컴퓨터

클라이언트 서비스를 제공받는 컴퓨터

 

 우클릭 -new - other- server 검색 - apache - tomcat9.0 - 경로지정

압축파일해제후 경로지정

실행환경 기본

서버등록완료

 

우클릭 - new - danamic new project

파일명 작성 - finish

서버프로그램이      들어가야하는위치

 

문서가 들어가야   하는위치

클래스네임 작성

 

오류 8080뜰시

 

포트변경

 

jsp스크립트  컴파일하지않고 작성한 스크립트의 페이지만 실행 

html코드안에서 jsp를 집어넣는 방식

 

 

jsp만드는방법

next - 파일명 입력

 

인코딩 바꿔줘야함.

% - 자바코드가 들어간다는 뜻

.jsp - html이 주가 됨. 화면을 꾸밀때 사용 , view용도

servelt - 속도가 빠르기 때문에 페이지 이동할 때 사용, controller 용도

내부적으로 servlet으로 변환 후 컴파일 후 실행 후 결과값을 처리하여 화면에 보여짐

 

 

out.println = <%= %> 같은의미임

 

 

 

request.getContextPath() : 해당되는 프로젝트의 jsp를 호출한다는 의미

'Backend > Java' 카테고리의 다른 글

문자열 비교시 ==을 사용할까? equals를 사용할까?  (0) 2023.04.21
Java 제네릭  (0) 2022.11.14
Java 예외처리  (0) 2022.11.10
Java 인터페이스(interface)  (0) 2022.11.09
Java 추상 클래스  (4) 2022.11.08

제네릭

  • 임시형으로 지정해놓고있다가 사용시점에서 내가 지정하는 형태로 사용하는 방식
  • 어떤 값이 하나의 참조 자료형이 아닌 여러 참조 자료형을 사용할 수 있도록 프로그래밍 하는 것.
  • 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법.
  • 참조자료형이 변환될 때 컴파일러가 검증을하기 때문에 매우 안정적이다.

 

제네릭 클래스 정의하기

package javastudy2;

//GenericPrinter<T> : 클래스이름
public class GenericPrinter<T> { //<T> : 타입의 약자 , 자료형 매개변수 
	private T material;

	public T getMaterial() {
		return material;
	}

	public void setMaterial(T material) {
		this.material = material;
	}
    
    public String toString() {
		return material.toString();
	}
}
  • 제네릭에서는 여러 참조 자료형을 사용해야하는 부분에 하나의 문자로 표현한다.
  • 여러 자료형으로 바꾸어 사용할 material 변수의 자료형을 T 라고(타입변수) 작성한 것이다.
  • 클래스 이름을 GenericPrinter<T>로 정의하고 나중에 클래스를 사용할 때 T 위치에 실제 사용할 자료형을 지정한다.
  • 클래스의 각 메소드에서 해당 자료형이 필요한 부분에는 모두 T문자를 사용하여 구현한다.
  • 여러개의 타입변수는 콤마( , )로 구분하여 명시할 수 있다.

 

다이아몬드 연산자<>

ArrayList<String> list = new ArrayList<>();

 <> : 다이아몬드 연산자

생략된 <> 부분이 String임을 컴파일러가 유추하기때문에 생성부분에서는 생략이 가능함.

 

 

자료형 매개변수 T와 static

  • static변수나 메소드는 인스턴스를 생성하지 않아도 클래스 이름으로 호출할 수 있다.
  • static 변수는 인스턴스 변수가 생성되기 이전에 생성된다.
  • static 메소드에서는 인스턴스 변수를 사용할 수 없다.
  • T의 자료형이 정해지는 순간은 제네릭 클래스의 인스턴스가 생성되는 순간이다.
  • T의 자료형이 결정되는 시점보다 빠르기 때문에 static변수의 자료형이나 static메소드 내부 변수의 자료형으로 
    T를 사용할 수 없다.

 

제네릭에서 자료형 추론하기

ArrayList<String> list = new ArrayList<String>();

var list = new ArrayList<String>();

지역 변수에 한해서 자료형을 추론할 수 있다.

 

powder 클래스 정의하기

package javastudy2;

public class Powder {
	public void doPrinting() {
		System.out.println("Powder 재료로 출력합니다.");
	}
	
	public String toString() {
		return "재료는 Powder입니다.";
	}
}

 

plastic 클래스 정의하기

package javastudy2;

public class Plastic {
	public void doPrinting() {
		System.out.println("Plastic 재료로 출력합니다.");
	}
	
	public String toString() {
		return "재료는 Plastic입니다.";
	}
}

 

GenericPrinter<T> 클래스 사용하기

package javastudy2;

public class GenericPrinterTest {
	public static void main (String[] args) {
    	//Powder 형으로 GenericPrinter클래스 생성
		GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
		
		powderPrinter.setMaterial(new Powder()); //powder클래스 생성
		Powder powder = powderPrinter.getMaterial(); //변수에 getMaterial값 대입
		System.out.println(powderPrinter);
		
        //Plastic 형으로 GenericPrinter클래스 생성
		GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>();
        
		plasticPrinter.setMaterial(new Plastic());
		Plastic plastic = plasticPrinter.getMaterial();
		System.out.println(plasticPrinter);
	}
}

선언된 제네릭클래스를  생성할때에는 타입변수 자리에 실제사용할 변수를 작성해야한다.

 

 

<T extends 클래스>

public class GenericPrinter<T extends Material>{
	private T material;
}

상위클래스 Material에서 선언한 메소드를 사용할 수 있다. 

 

제네릭 메소드

//public <자료형 매개변수> 반환형 메소드(자료형 배개변수...){...}
public T getX(){
	return x;
}
  • 반환형 앞에 사용하는 <자료형 매개변수>는 여러 개일 수 있다.
  • 제네릭 메소드 내에서만 유효하게 사용할 수 있다.

'Backend > Java' 카테고리의 다른 글

문자열 비교시 ==을 사용할까? equals를 사용할까?  (0) 2023.04.21
servlet  (0) 2022.11.15
Java 예외처리  (0) 2022.11.10
Java 인터페이스(interface)  (0) 2022.11.09
Java 추상 클래스  (4) 2022.11.08

예외처리

소프트웨어를 사용하다보면 여러가지 상황의 오류를 맞이하게 된다.

잘 접속되던 사이트가 접속이 안 되거나, 스마트폰 앱이 갑자기 종료되는 경우와 같다.

오류가 발생하더라도 갑자기 종료되는 상황이 일어나지 않도록 하는것이 예외처리이다.

 

 

예외클래스의 종류

오류 클래스는 모두Throwable 클래스에서 상속을 받는다.

Error 클래스의 하위클래스는 시스템에서 발생하는 오류를 다루며 프로그램에서 제어하지 않는다.

Exception 클래스와 그 하위에있는 예외 클래스들이 프로그램을 제어한다.

자바에서 자주사용하는 예외클래스는 다음과 같다.

  1. ClassCastException : 수행할 수 없는 타입변환이 진행될 경우
  2.  ArrayIndexOutofBoundsException : 배열에 잘못된 인덱스를 사용하여 접근하는 경우
  3. NullPointerException : null 객체의 인스턴스 메소드를 호출하는 경우
  4. ArithmeticException : 산술연산에서 정수를 0으로 나누는 등 연산을 수행할 수 없는 경우

 

try-catch문

try{
	예외가 발생할 수 있는 코드부분
}catch(처리할 예외 타입 e){
	try블록 안에서 예외가 발생했을 때 예외를 처리하는 부분
}

위와 같이 코드 작성시 a.text 파일이 존재하지않는 오류가 발생할 수 있다는 경고문이 뜬다.

예외 상황에 대한 예외처리를 위해 'Surround with try/catch'를 클릭해 try-catch문으로 감싼다.

 

예외가 발생할 위험이 있는 코드는  try 블록으로 감싸고 예외가 발생하면 catch 블록을 수행한다.

try문으로 감싸진 부분에서 발생할 수 있는 예외는 FlieNotFoundException이고 변수이름은 e로 선언되었다.

그리고 어디에서 예외가 발생했는지 따라가는 printStackTrace() 메소드가 호출되었다.

코드를 실행해보면 결과화면에 예외 이름과 내용이 보인다.

 

예외가 발생했을 때 FileNotFoundException e의 toString() 메소드가 호출되는 코드이다.

 

출력결과에서 보면 첫번째 줄은 e의 출력내용이다.

만약 비정상 종료되었다면 다른수행이 일어나지 않았겠지만 두번째줄이 출력된 결과를 보면 

예외처리 후에도 프로그램이 계속 수행되었음을 알 수 있다.

 

 

try-catch-finally문

프로그램에서 사용한 리소스는 프로그램이 종료되면 자동으로 해제된다. 하지만 끝나지 않고 계속 수행되는 서비스같은

경우에는 리소스를 여러 번 반복해서 열기만 하고 닫지않는다면 문제가 발생한다.

따라서 사용한 리소스는 사용 후 close()메소드로 닫아 주어야한다.

만약 try블록 안에서 발생할 수 있는 예외상황이 여러개라면 catch블록을 예외상황 수만큼 구현을 해야한다.

하지만 리소스를 해제하는 코드를 각 블록에 모두 작성해야 한다면 매우 번거롭게된다.

이때 사용하는 블록이 'finally'이다. finally 블록은 어떤 경우에도 반드시 수행된다.

try{
	예외가 발생할 수 있는 부분
}catch(처리할 예외타입 e){
	예외를 처리하는 부분
}finally{
	항상 수행되는 부분
}

출력결과

입력받는 파일이 없는 경우에 대해 try-catch문을 사용해 FileNotFoundException 예외처리를 했다.

프로그램을 실행하면 a.txt파일이 없으므로 예외처리가 발생하여 catch 블록이 수행된다.

예외를 출력하고 17행에서 강제로 return을 했지만 상관없이 finally 블록이 수행되어 '항상 수행됩니다.'

문장이 출력되고있다.

 

 

try-with-resources문

자바 7부터 try-with-resources문을 제공하여 close() 메소드를 명시적으로 호출하지 않아도 try 블록 내에서

열린 리소스를 자동으로 닫도록 만들 수 있다.

try-with-resources 문법을 사용하려면 해당 리소스가 AutoCloseable 인터페이스를 구현해야한다.

AutoCloseable 인터페이스에는  close() 메소드가 있고 이를 구현한 클래스는 close()를 명시적으로 호출하지

않아도 정상적인 경우와 예외가 발생한 경우 모두 close()메소드 부분이 호출된다.

 

예외가 발생하지않고 정상종료되는 예제

//AutuClosealbe 인터페이스 구현하기
package javastudy2;

public class AutoCloseObj implements AutoCloseable{

	@Override
	public void close( ) throws Exception{
		System.out.println("리소스가 close() 되었습니다.");
	}
}
package javastudy2;

public class AutoClassTest {

	public static void main(String[] args) {
		try(AutoCloseObj obj = new AutoCloseObj()){
			
		}catch(Exception e) {
			System.out.println("예외부분입니다.");
		}
	}

}

try-with-resources 문을 사용할 때 try문의 괄호()안에 리소스를 선언한다.

출력결과

//소스코드를 여러개 생성해야하는 경우

try(A a = new A(); B b = new B()){
	....
}catch(Exception e){
	....
}

소스를 여러개 생성해야한다면 세미콜론(;)으로 구분한다.

 

 

예외가 발생하여 종료되는 예제

package javastudy2;

public class AutoClassTest {

	public static void main(String[] args) {
		try(AutoCloseObj obj = new AutoCloseObj()){
			throw new Exception(); //강제예외발생
		}catch(Exception e) {
			System.out.println("예외부분입니다.");
		}
	}

}

'throw new Exception()' 문장을 사용하면 프로그램에서 강제로 예외를 발생시켜 catch블록이 수행되도록 한다.

출력결과

 

향상된 try-with-resources문 (자바 9에서 추가된 문법)

package javastudy2;

public class AutoClassTest {

	public static void main(String[] args) {
   	    AutoCloseObj obj = new AutoCloseObj(); //리소스변수 외부선언
		try(obj){ //외부에서 선언한 변수를 그대로 쓸 수 있음
			throw new Exception(); //강제예외발생
		}catch(Exception e) {
			System.out.println("예외부분입니다.");
		}
	}

자바 9부터는 try문의 괄호 안에서 외부에서 선언한 변수를 그대로 사용할 수 있다.

 

 

예외 처리 미루기 (throws)

예외를 해당 메소드에서 처리하지 않고 미룬 후 메소드를 호출하여 사용하는 부분에서 예외를 처리하는 방법.

8행을 보면 FileNotFoundException 과 ClassNotFoundException 이 발생할 수 있는 예외처리를 미루겠다는 뜻의

'thows' 를 메소드 선언부에 추가하였다.

이 두가지 예외는 해당 메소드를 호출하여 사용하는 부분에서 예외처리를 해야한다.

main() 함수의 16행을 보면 loadClass() 메소드를 호출하는 부분에서 오류가 표시되고 세가지 옵션중 하나를 선택하여

오류를 처리할 수 있다.

  1. Add throws declaration : main() 함수 선언부분에서 throws FileNotFoundException , ClassNotFoundException을 추가하고 예외처리를 미룬다는 뜻. 하지만 예외를 처리하는 것이 아니라 대부분의 프로그램이 비정상 종료되기때문에 사용하지 않는 것이 좋다.
  2. Surround with try/multi-catch : 여러 예외를 한번에 처리하기
  3. Surrround with try.catch : 예외 상황마다 처리하기

 

 

Surround with try/multi-catch 옵션

이 옵션은 하나의 catch문에서 여러 예외를 한 문장으로 처리하겠다는 뜻이다.

 

Surround with try/catch 옵션

예외 상황의 수만큼 catch문이 생성된다.

각 예외 상황마다 다른 방식으로 처리해야하고 로그도 다르게 남겨야하는 경우 사용하는 옵션이다.

'Backend > Java' 카테고리의 다른 글

servlet  (0) 2022.11.15
Java 제네릭  (0) 2022.11.14
Java 인터페이스(interface)  (0) 2022.11.09
Java 추상 클래스  (4) 2022.11.08
Java 다형성  (0) 2022.11.08
인터페이스란?
다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서
다른 클래스 사이의 중간 매개역할을 해주는 일종의 추상클래스를 의미한다. 


인터페이스

  • 인터페이스는 추상메소드와 상수로만 이루어져있다.
  • 구현된  코드가 없기 때문에 인스턴스를 생성할 수 없다.

 

인터페이스 만들기

package javastudy;

public interface Calc {

	//인터페이스에서 선언한 변수는 컴파일 과정에서 상수로 변환됨.
	double PI = 3.14;
	int ERROR = -999999999;
	
    //인터페이스에서 선언한 메소드는 컴파일 과정에서 추상메소드로 변환됨.
	int add(int num1, int num2);
	int substract(int num1, int num2);
	int times(int num1, int num2);
	int devide(int num1, int num2);
}

인터페이스에서 선언한 메소드는 모두 구현 코드가 없는 추상메소드이다.

public abstract예약어를 명시적으로 쓰지않아도 컴파일 과정에서 자동으로 추상메소드로 변환된다.

인터페이스에서  선언한 변수 또한 컴파일 과정에서 값이 변하지 않는 상수도 자동 변환되기때문에

static final 예약어를 사용하지 않아도 된다.

 

 

클래스에서 인터페이스 구현하기

package javastudy;

public abstract class Calculator implements Calc{

	@Override
	public int add(int num1, int num2) {
		return num1 + num2;
	}

	@Override
	public int substract(int num1, int num2) {
		return num1 - num2;
	}


}

위에서 선언한 인터페이스를 클래스가 사용하는 것을 '클래스에서 인터페이스를 구현한다(implements)'라고  표현한다.

따라서 인터페이스에서 선언한 기능을 클래스가 구현한다는 의미로 implements 예약어를 사용한다.

Calc 인터페이스에 포함된 추상메소드를 Calculator 클래스에서 구현하여 사용해야한다.

여기에서는 4개의 Calc 메소드중 2개만 구현하여 추상클래스를 만들었다. 

 

 

 

계산기 클래스 만들기

package javastudy;

public class CompleteCalc extends Calculator {

	@Override
	public int times(int num1, int num2) {
		return num1 * num2;
	}

	@Override
	public int devide(int num1, int num2) {
		if(num2 != 0) {
			return num1 / num2 ;			
		}else {
			return Calc.ERROR;
		}
	}

	//CompleteCalc에서 추가로 구현한 메소드
	public void showInfo() {
		System.out.println("Calc 인터페이스를 구현하였습니다.");
	}
}

CompleteCalc클래스에서는 아직 구현되지 않은 나머지 2개의 추상메소드를 구현한다.

 

 

CompleteCalc클래스 실행하기

package javastudy;

public class CalculatorTest {

	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 5;
		
		CompleteCalc calc = new CompleteCalc();
		System.out.println(calc.add(num1, num2));
		System.out.println(calc.substract(num1, num2));
		System.out.println(calc.times(num1, num2));
		System.out.println(calc.devide(num1, num2));
		calc.showInfo();
	}

}

출력화면

 

Calculator 클래스는 인터페이스에서 선언한 추상메소드 중 일부만 구현했으므로 추상클래스이다.

그리고 이를 상속받은 CompleteCalc 클래스는 Calclator에서 구현하지 못한 추상메소드를 모두 구현하였다.

인터페이스를 통해 다중상속을 함으로써 클래스와 클래스를 연결할 수 있다.

'Backend > Java' 카테고리의 다른 글

Java 제네릭  (0) 2022.11.14
Java 예외처리  (0) 2022.11.10
Java 추상 클래스  (4) 2022.11.08
Java 다형성  (0) 2022.11.08
Java 생성자  (0) 2022.11.07

추상 메소드(abstract method)

  • 자식클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드
  • 추상메소드를 선언하여 사용하는 목적은 추상메소드가 포함된 클래스를 상속받는 자식클래스가 
    반드시 추상메소드를 구현하기 위함이다.
  • 추상메소드는 선언부만 존재하며 구현부는 작성되어있지않다.
  • 작성되어있지 않은 구현부를 자식클래스가 오버라이딩하여 사용한다.
//추상메소드 문법
abstract 반환타입 메소드이름();

 

 

추상 클래스(abstract class)

  • 하나 이상의 추상메소드를 포함하는  클래스
//추상클래스 문법
abstract class 클래스이름 {
	abstract 반환타입 메소드이름 ();
}

 

추상클래스 생성

package javastudy;

public abstract class Car extends Object {
	
	public Car() {
		super();
	}

	int wheel;
	String carName;
	int handle;
	
	public void drive() {
		System.out.println(carName + "이동하다");
	}
	
	public abstract void openDoor(); //호출이 아니라 구현부가 없다. 메소드 선언만함 
}

클래스 생성시 abstract를 체크하면 추상클래스 생성된다.

이러한 추상클래스는 동작이 정의되어있지 않은 추상메소드를 포함하고있으므로 인스턴스를 생성할 수 없다.

 

package javastudy;

public class AbstClass {

	public static void main(String[] args) {

		Car car = new Car(); //추상클래스는 객체생성이 안된다.
	}

}

추상클래스는 객체생성이안된다.

 

 

 

Car Class를 Sonata Class에 상속 후 미구현된 메소드이기에 구현을해줘야함

 

 

Sonata Class에서 Car Class의 openDoor 오버라이딩으로 재정의를 한다.

 

오버라이딩 후 인스턴스를 생성하여 Car클래스에 접근 할 수 있다.

 

Sonata s = new Sonata(); //소나타 객체생성
		s.carName = "소나타";
		s.drive();
		s.openDoor();

출력결과

 

package javastudy;

public class Sonata extends Car {
	
	public Sonata(String carName) { //매개변수가 있는 생성자
		this.carName = carName;
	}

	@Override
	public void openDoor() {
		System.out.println("문을열다");
	}

}


Sonata s = new Sonata("소나타"); //소나타 객체생성
		//s.carName = "소나타";
		s.drive();
		s.openDoor();

Sonata Class의 생성자에 매개변수를 입력하고 인자값을 넣어 출력할수도 있다.

출력값

출력값은 동일하다.

 

 

setter / getter

	//setter(담을때) getter(꺼낼때)
	//멤버변수가 private으로 접근제어되었을때 우회해서 메소드를 통해 입출력할때
	public void setHand(int hand) {
		this.hand = hand; //setHand라는 메소드 호출해서 hand라는 변수 대입
	}
	
	public int getHand() {
		return hand;
	}
	
	public void setLeg(int leg) {
		this.leg = leg;
	}
	
	public int getLeg() {
		return leg;
	}

 

 

Person person = new Person();
		person.setHand(2);
		person.setLeg(2);
		person.eat();
		person.run();

 

에디터의 기능으로 setter 와 getter를 직접 타이핑하지않고 만들 수 있다. 

	//setter getter 메소드 사용하기 객체변수(멤버)가 private으로 막혀있을때
		private int a;
		private int b;
		private int c;
		private String d;
		private String e;
		private String f;
    
    public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

	public int getC() {
		return c;
	}

	public void setC(int c) {
		this.c = c;
	}

	public String getD() {
		return d;
	}

	public void setD(String d) {
		this.d = d;
	}

	public String getE() {
		return e;
	}

	public void setE(String e) {
		this.e = e;
	}

	public String getF() {
		return f;
	}

	public void setF(String f) {
		this.f = f;
	}

 

 

 

 

 

 

 

 

 

번외

컴파일시 에러가 나는데 진행할거냐는 경고창

'Backend > Java' 카테고리의 다른 글

Java 예외처리  (0) 2022.11.10
Java 인터페이스(interface)  (0) 2022.11.09
Java 다형성  (0) 2022.11.08
Java 생성자  (0) 2022.11.07
Java 싱글톤 패턴  (0) 2022.11.04
다형성이란?
하나의 객체가 여러 타입을 가질 수 있는 것

다형성의 특징

  • 오버 라이딩 :  상속받은 하위 객체가 상위 객체의 메소드를 새로 정의하여 사용한다.
    (반환형, 메소드이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야한다.)
  • 오버로딩 : 하나의 객체에서 이름이 같은 메소드를 여러개 정의하여 사용한다. (인자의 종류와 갯수는 달라야함.)
  • 캐스팅(casting) : 타입을 변환하는 것(형변환) 
  • 업캐스팅(upcasting) : 자식클래스가 부모클래스 타입으로 형변환 되는 것
  • 다운캐스팅(downcasting) : 부모클래스가 자식클래스 타입으로 형변환 되는 것 

 

부모클래스 생성

package javastudy2;

public class Animal {
	
	public void move() {
		System.out.println("움직이다.");
	}

}

 

부모 - 자식 간 클래스 상속

package javastudy2;

public class Duck extends Animal{

	String name;
	
	//생성자 오버로딩 : 이름은 같으나 타입이나 크기가 달라서 다른용도로 쓰이는 메소드
	public Duck(String name) {
		this.name = name;
	}

	@Override //재정의(오버라이딩)된 메소드라는 정보제공
	public void move() {
		System.out.println("오리 날다"); //Animal 클래스의 move 재정의
	}
}

 

Main 클래스

package javastudy2;

public class Main {

	public static void main(String[] args) {

		 Duck duck = new Duck();
		 duck.move();
	}

}

출력값

원래 부모클래스를 상속한 자식클래스에서 부모 메소드를 호출하면 부모 메소드에 정의된 메소드가 호출된다.

하지만 Duck 클래스에서 move메소드를 재정의(오버라이딩) 했기때문에 Duck에 정의된 메소드가 호출된다.

 

instanceof

  • 객체 타입을 확인하는데 사용된다.
  • 다운캐스팅을 하기 전 상위클래스로 형 변환된 인스턴스의 원래 자료형을 확인한다.
  • 형 변환이 가능한지 여부를 true 또는 false로 알 수있다.

'Backend > Java' 카테고리의 다른 글

Java 인터페이스(interface)  (0) 2022.11.09
Java 추상 클래스  (4) 2022.11.08
Java 생성자  (0) 2022.11.07
Java 싱글톤 패턴  (0) 2022.11.04
Java 배열  (0) 2022.11.04

생성자

생성자 메소드 호출

  • 객체 생성에 관여한다.
  • 클래스를 처음 만들 때 멤버변수나 상수를 초기화하는데 사용한다.
  • 생성자 클래스는 생성할 때만 호출한다.
  • 생성자 이름은 클래스와 같고, 생성자는 반환값이 없다.
  • 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버변수 값들 초기화한다.
  • 생성자는 매개변수에 따라 여러개를 만들 수 있다.

 

디폴트 생성자

  • 생성자가 없는 클래스는 클래스 파일을 컴파일 할때 자바 컴파일러에서 자동으로 생성자를 만들어준다.
  • 자바 컴파일러는 생성자가 하나도 없는 경우에만 디폴트 생성자를 제공한다.
  • 매개변수와 구현코드가 없다.
  • 생성자 이름은 클래스 이름과 같다.
  • 생성자는 반환값이 없다.

 

생성자 만들기

 

  • this : 자기자신의 클래스(Constr)의 변수 'a' 에 '1000'을 담는다.
  • 생성자는 주로 멤버변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버변수 값들을 초기화하는 역할을 한다.

 

public A() {   } - 생성자 메소드, 기본생성자 매개변수 없음.

기본형이 아닌 생성자는 생성자를 작성해야한다.

super 부모, 상위  상위클래스에 생성자를 호출해야 객체생성. 생성자의 첫번째줄에 무조건 있어야함.

작성이 안되어있어도 첫줄에 생략되어 있다.

 

 

 

★자바의 메모리 구조형

class : 클래스,변수,메소드 이름, 클래스에 대한 정보를 등록하는영역

stack : 메소드를 동작시키는 영역, 

heap : 객체생성 시키는 영역

 

static

  • static : 클래스소속
  • static 이 없는 경우 : 인스턴스 소속
  • 클래스로 정의된 변수나 메소드는 클래스를 통해서 접근가능하지만, 인스턴스로 정의된 변수나 메소드는 해당클래스의 인스턴스를 생성해야만 접근할 수 있다.
  • 인스턴스에서 해당 클래스로 정의된 변수를 수정하면 그 클래스를 퐘한 모든 인스턴스의 변수가 수정되지만, 인스턴스에서 해당 인스턴스로 정의된 변수를 수정하면 해당 인스턴스의 변수만 수정된다.

 

 

접근제어

public : 접근제어자, 메소드를 외부에서 사용하려고 할 때 접근사용여부를 제어하는 예약어

             어디에서든 접근허용

private : 접근제한, 외부에서 사용 불가능, class내부에서만 사용가능

default : 같은 폴더(패키지) 범위 내에서 사용

protected : 상속받은 패키지까지 사용가능

'Backend > Java' 카테고리의 다른 글

Java 추상 클래스  (4) 2022.11.08
Java 다형성  (0) 2022.11.08
Java 싱글톤 패턴  (0) 2022.11.04
Java 배열  (0) 2022.11.04
Java 상속  (0) 2022.11.03
싱글톤 패턴이란?
하나의 클래스로 하나의 객체만 만듦


private 생성자 만들기

//private생성자 만들기
	private Company() { 

	}
  • 생성자는 외부에서 호출할 수 없도록 private으로 지정해야한다.

 

인스턴스 생성하기

//인스턴스 생성하기
	private static Company instance = new Company();//instance에 Conmpany주소값을 담는다.
  • private으로 선언하여 외부에서 인스턴스에 접근하지 못하도록 제한해야 오류를 방지할 수 있다.
  • 외부에서 접근이 안되는 Company class의 변수 instance를 선언하고 객체생성 시켜서 초기화한다.

 

 

public 메소드 만들기

//외부에서 참조할 수 있는 public메소드 만들기
    public static Company getInstance(){ 
    //인스턴스를 반환하는 메소드는 static으로 선언해야함
    //getInstance메소드는 인스턴스 생성과 상관없이 호출할수 있어야하기때문
    
		return instance; //생성된 인스턴스 반환
  • private을 선언한 인스턴스를 외부에서도 사용할 수 있도록 설정하기 위해 public메소드를 생성한다.
  • 생성한 인스턴스를 반환해준다.
  • getInstance메소드를 인스턴스 생성과 상관없이 호출할 수 있게 인스턴스를 반환하는 메소드를 static으로 선언한다.

 

변수의 주소값 비교하기

Company inst = Company.getInstance();
System.out.println("생성된 객체 주소값은 "+inst); 
Company inst2 = Company.getInstance();
System.out.println("생성된 객체 주소값은 "+inst2);//하나의 객체만 생성하기때문에 주소값이 동일함

출력값

참조 값을 가지는 동일한 인스턴스이기 때문에 여러번을 호출해도 항상 같은 주소의 인스턴스가 반환된다.

'Backend > Java' 카테고리의 다른 글

Java 다형성  (0) 2022.11.08
Java 생성자  (0) 2022.11.07
Java 배열  (0) 2022.11.04
Java 상속  (0) 2022.11.03
Java 객체, 메소드  (0) 2022.11.01
배열이란?
같은타입의 같은 용도의 데이터 집합체
메모리를 효율적으로 사용할 수 있다.

배열 선언과 초기화

int[] a =new int[1000]; //int형 배열선언과 초기화
  • 자료형[] 배열이름 = new 자료형[개수]
  • 'new' 예약어는  배열을 새로 만든다는 의미이다.
  • 배열 요소의 자료형은 모두 같다.
  • 배열을 선언하면 그와 동시에 각 요소의 값이 초기화된다.
int[] aa = new int[] {1,2,3,4,5,6,7,8,9,10};//배열선언과 동시에 초기화, 개수는 생략한다. 개수작성시 오류발생함.
int[] aaa = {1,2,3,4,5,6,7,8,9,10}; //선언과 동시에 초기화 시 new int[] 생략 가능하다.

int[] aa; //int형 배열 선언
aa = new int[]{1,2,3}; //배열생성 후 초기화

배열의 자료형을 먼저 선언하고 초기화하는 경우에는 new int[]를 생략할 수 없다.

 

a[0] = 1; //배열의 첫번째 요소 인덱스는 0부터 시작
a[1] = 2;
a[3] = 10;

선언한 배열의 각 요소에 값을 넣을때나 가져올 때는 []를 사용하고,

배열 요소에 값을 저장할땐 위와 같은 코드를 작성한다.

 

숫자 배열

int[] a;
a = new int[1000];

		for(int i = 0; i <a.length; i++) {//a.length 배열이 크기를 알수있음.
			a[i] = i+1;
			System.out.println("각 배열방에 담긴 값은? "+a[i]);}

자바의 배열은 배열 길이를 나타내는 length 속성을 가진다.

배열길이는 처음에 선언한 배열의 전체 요소 개수를 의미한다.

전체길이를 알고 싶은 배열 이름뒤에 도트( . ) 연산자를 붙이고 length속성을 쓰면 배열 길이를 반환한다.

 

//1에서 10까지의 합을 배열을 통해서 구하시오.
		int[] b = new int[10];
		int sum = 0;
		for(int i = 0; i<b.length; i++) {
			b[i] = i+1;
			sum += b[i];		
		}
		System.out.println("1에서 10까지의 합은? "+sum);

배열과 for문은 주로 같이 사용된다.

 

 

문자배열

//문자형 배열
		char[] alpa = new char[26]; //char타입으로 26개의 배열을 만들다.
		char ch = 'A';
		
		for(int i = 0; i<alpa.length; i++) {
			alpa[i] = ch;			
			ch++;			
		}
		
		for(int i = 0; i<alpa.length; i++) {
			System.out.println("담긴 알파벳은? "+alpa[i]);
			System.out.println("담긴 알파벳의 매칭된번호는? "+(int)alpa[i]);
		}

출력값

 

 

객체배열

package javastudy;

public class Book {
	
    //멤버변수 선언
	String name; 
	
    //책 이름을 매개변수로 받는 생성자
	public Book(String nm){ //생성자생성, String타입의  매개변수nm
		this.name = nm;	//매개변수의 값을 멤버변수에 담는다.
	} 
	
    //책의 정보를 출력해주는 메소드
	public void explain() {
		System.out.println("책이름은? "+ name);
	}
}

먼저 클래스를 생성한다.

책 이름을 매개변수로 받는 생성자를 만든다.

//객체배열 생성

		//Book타입의 배열 3개를 만든다.
		Book[] book = new Book[3]; //Book 클래스의 생성자를 참조변수 book에 담는다.
		
		//인스턴스 생성 후 배열에 저장
        book[0] = new Book("국어"); //매개변수의 인자값으로 국어를 넘긴다.
		book[1] = new Book("수학");
		book[2] = new Book("영어");
		
		for(int i = 0; i<book.length; i ++) {
			System.out.println("책이름을 알려주세요. ");
			book[i].explain();
		}

 

향상된  for문

향상된 for문은 배열의 처음부터 끝까지 모든 요소를 참조할 때 사용하기 편리한 반복문이다.

배열 요소 값을 순서대로 하나씩 가져와서 변수에 대입한다.

초기화와 종료조건이 없기 때문에 모든 배열의 시작 요소부터 끝요소까지 실행한다.

//향상된 for문 - 주로 객체배열을 돌릴때 사용한다.
		for(Book b :book) {
			System.out.println("책이름을 알려주세요.");
			b.explain();
		}

문법 - for(자료형 변수명 : 배열명) { 반복실행문 }

 

 

2차원 배열

//2차원 배열	
    	int[][] arr = {{1,2,3},{4,5,6}};
		
		System.out.println("첫번째방 첫번째 값은?" +arr[0][0]);
		System.out.println("두번째방 두번째 값은?" +arr[1][1]);
		
		for(int i = 0; i<arr.length; i++) { //각 방의 크기
			System.out.println(arr[i]);
			for(int j = 0; j<arr[i].length; j++) { //각 방마다 들어가 있는 요소의 크기
				System.out.println(arr[i][j]);
			}
		}

행과 열 개수에 맞추어서 중괄호{} 안에 콤마(,)로 구분하여 값을 작성한다.

'Backend > Java' 카테고리의 다른 글

Java 생성자  (0) 2022.11.07
Java 싱글톤 패턴  (0) 2022.11.04
Java 상속  (0) 2022.11.03
Java 객체, 메소드  (0) 2022.11.01
Java 반복문  (0) 2022.10.31

+ Recent posts