목록Categories (1099)
KoreanFoodie's Study
인터페이스의 역할 인터페이스는 객체의 사용 방법을 정의한 타입이다. 개발 코드가 중간에 인터페이스를 두는 이유는, 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서이다. 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다. 따라서 개발 코드 측면에서 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있다는 장점이 있다. 인터페이스 선언 인터페이스는 "~.java" 형태의 소스 파일로 작성되고 컴파일러(javac.exe)를 통해 "~.class" 형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일하다. public interface InterfaceName { ... } 인터페이스는 상수와 메소드만을..
타입 변환과 다형성 (Polymorphism) 다형성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 자동 타입 변환(Promotion) 자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것이다. // Vehicle 자동 타입 변환이 발생한다! 즉, 매개 변수의 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있다! 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행 결과는 다양해질 수 있다(매개 변수의 다형성). 자식 객체가 부모의 메소드를 재정의(오버라이딩)했다면 메소드 내부에서 오버라이딩된 메소드를 호출함으로써 메소드의 실행 결과는 다양해진다. 강제 타입 변환 강제 ..
어노테이션 어노테이션은 메타데이터라고 볼수 있다. @AnnotationName 어노테이션은 다음 세 가지 용도로 사용된다. 1. 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공 2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공 3. 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공 대표적으로는 @Override가 있다. (상속 메소드 재정의 시) 어노테이션 타입 정의와 적용 어노테이션 타입의 정의는 인터페이스를 정의하는 것과 유사하다. 다음과 같이 @interface를 사용해서 어노테이션을 정의하며, 그 뒤에 사용할 어노테이션 이름이 온다. public @interface AnnotationName { 타입 elementName() [default 값]..
패키지 자바에서는 클래스를 체계적으로 관리하기 위해 패키지를 사용한다. 패키지의 물리적인 형태는 파일 시스템의 폴더이다. 패키지는 단순히 파일 시스템의 폴더 기능만 하는 것이 아니라 클래스의 일부분이다. 패키지는 클래스를 유일하게 만들어주는 식별자 역할을 한다. 패키지는 클래스를 유일하게 만들어주는 식별자 역할을 한다. 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식한다. 클래스의 전체 이름은 "패키지명+클래스명"인데, 패키지가 상/하위로 구분되어 있다면 도트(.)를 이용해 표현한다. 상위패키지.하위패키지.클래스 클래스를 이동시킬 때는 패키지 전체를 이동시켜야 한다. 즉, myPackage 내의 myClass를 yourPackage로 옮긴다면, 해당 클래스는 사용할 수 없게 된다! 패키지 ..
정적(static) 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다. 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 도트(.) 연산자로 접근한다. int a = myClass.value; myClass.doSomething(a); 정적 초기화 블록 정적 필드는 다음과 같이 필드 선언과 동시에 초기값을 주는 것이 보통이다. 그러나 계산이 필요한 초기화 작업의 경우, 정적 블록(static block)을 사용할 수 있다. static { ... } 정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행된다. 정적 블록은 클래스 내부에 여러 개가 선언되어도 상관없고, 선언된 순서대로 실행된다. public class TV..
데이터 타입 데이터 타입은 primitive type과 reference type(참조 타입)으로 나뉜다. 참조 타입이란 객체의 번지를 참조하는 타입으로, 배열, 열거, 클래스, 인터페이스 타입이 이에 해당된다. 자바는 배열의 주소를 스택 영역에, 실제 데이터 값은 힙 영역에 할당한다. 메모리 사용 영역 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)를 다음과 같이 구분해서 사용한다. 1. 메소드 영역 : 코드에서 사용되는 클래스(~.class)들을 클래스 로더로 읽어 클래스별로 런타임 상수풀(runtime constant pool), 필드(fiedl) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(constructor) 코드 등을 분류해서 저장한다. 메소드 영..
벡터 벡터는 방향과 크기를 가진다. 벡터 (1, 0, 2)이 있을때, 해당 벡터의 크기는 sqrt(1^2 + 2^2)이 된다. 유니티는 Vector2, Vector3, Vector4 타입을 지원한다. 새로운 벡터를 만들 때는 생성자를 호출하면 된다. // Vector는 클래스가 아니라 구조체이다! public struct Vector3 { public float x; public float y; public float z; // Vector3 내부 코드 } Vector3 a = new Vector3(0, 0, 0); Vector3 b = a; b.x = 100; 벡터의 연산 내적과 외적의 의미를 이해하는 것이 중요하다. 백터의 내적은 Dot Product라고하는데, a · b 라고 하면, 벡터 b를 a의..
바닥 회전 Rotate( ) 메서드를 이용해서 물체를 회전시킬 수 있다. public class Rotator : MonoBehaviour { public float rotationSpeed = 60f; // Update is called once per frame void Update() { transform.Rotate(0f, rotationSpeed * Time.deltaTime, 0f); } } 위에서 rotationSpeed에 Time.deltaTime을 곱합으로써, 어떤 기기에서도 안정적으로 1초마다 rotationSpeed만큼의 각도의 회전을 줄 수 있다. Update( ) 는 1프레임마다 실행되며, Time.deltaTime은 ( 1 / 초당 프레임 수)이므로, 프레임이 60이든 120이든..
프리팹 게임 오브텍트는 프리팹으로 만들어 재활용할 수 있다. 마치, 칼을 찍어내는 주물이라고 생각하면 된다! 사용법은 간단하다. Hierarchy에 있는 오브젝트를 프로젝트 창에 드래그&드랍 해주기만 하면 된다! Use Gravity 리지드 바디 컴포넌트의 Use Gravity 필드를 해제하면 중력의 영향을 받지 않는다. transform 변수 transform은 스크립트에서 자신의 트랜스폼 컴포넌트로 바로 접근하는 지름길이다! Destroy( ) void Start() { // 이동에 사용할 리지드바디 컴포넌트 할당 bulletRigidbody = GetComponent(); // 리지드바디의 속도 = 앞쪽 방향 * 이동 속력 bulletRigidbody.velocity = transform.forwa..
머티리얼 게임 오브젝트의 컬러는 머티리얼(Material)이 결정한다. 머티리얼은 셰이더와 텍스쳐가 합쳐진 에셋으로, 오브젝트의 픽셀 컬러를 결정한다 셰이더는 주어진 입력에 따라 픽셀의 최종 컬러를 결정하는 코드이다. 셰이더는 질감과 빛에 의한 반사와 굴절 등의 효과를 만든다. 텍스처는 표면에 입히는 이미지 파일이다. 셰이더는 물감으로, 텍스처는 스케치나 밑그림으로 이해하면 된다. 밑그림이 같아도 물감의 종류에 따라 화풍이 달라진다! 이 중 알베도(Albedo)는 반사율이라는 뜻으로, 물체가 어떤 색을 반사할지를 결정한다! C# 스크립트 이제 기초적인 코드들을 살펴보자. void FixedUpdate() { if (Input.GetKey(KeyCode.UpArrow) == true) { playerRig..