값이 저장된 메모리 주소 얻기, 특정 메모리 주소에 저장된 값 얻기

요즘 같은 개발 환경에서 메모리의 주소를 직접 얻고 해당 메모리에 저장된 값을 읽는 코드를 …? 러스트 프로그래밍 언어에서 …

먼저 어떤 값에 대한 메모리 주소를 얻는 코드는 다음과 같습니다.

fn main() {
    let a = 3224;
    let mut memory_location = (&a as *const i32) as usize;
    
    println!("데이터 저장 메모리 주소 : {}", memory_location);

memory_location이 3224 값이 바인딩된 a의 주소값을 담고 있습니다. 이제 memory_location 값(주소)에 저장된 값을 읽는 코드는 다음과 같습니다.

    unsafe  {
        let v = *(memory_location as *const i32);
        println!("메모리 주소({memory_location})에 저장된 값: {}", v);

        memory_location += 4;
        let v = *(memory_location as *const i32);
        println!("메모리 주소({memory_location})에 저장된 값: {}", v);
    }
}

메모리 주소를 통한 값의 직접적 참조는 매우 매우 위험한 행위이므로 반드시 unsafe 코드임을 명시해야 합니다.

사용자 정의 데이터에 대한 println!의 출력

Rust에서 내가 정의한 데이터를 println!를 이용해 화면에 출력하기 위해서는 반드시 std::fmt::Display 트레이트를 구현해야 합니다. 먼저 다음과 같은 MyStruct라는 데이터를 정의합니다.

struct MyStruct {
    name: String,
    age: u16,
}

fn main() {
    let o = MyStruct {
        name: String::from("Ferris"),
        age: 17,
    };

    println!("{}", o);
}

위의 코드 12번은 에러를 발생하는데, 이는 MyStruct 타입의 o 객체를 콘솔에 출력하기 위해서는 MyStruct에 대해 std::fmt::Display 트레이트를 구현하지 않았기 때문입니다. 정상적으로 작동하기 위해서 위의 코드에 대해 다음처럼 보완하면 됩니다.

use std::fmt;

struct MyStruct { ... }

impl fmt::Display for MyStruct {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "name: {}, age: {}", self.name, self.age)
    }
}

fn main() {
    let ferris = ...

    println!("{}", ferris);
}

라인을 포인트로 변경 (Line To Point)

지오서비스웹에서 제공하는 공간 데이터 생성 기능 중 폴리라인을 포인트로 변환해 생성해주는 기능을 제공합니다.

이 기능을 사용하기 위해서는 먼저 폴리라인 데이터를 아카이브에 업로드한 뒤에 레이어로 추가합니다. 아래는 도로 중심선에 대한 공간 데이터를 레이어로 추가한 화면입니다.

이렇게 레이어가 추가된 폴라라인을 포인트로 변경하기 위해서 메인메뉴의 [생성]-[라인을 포인트로 변경]을 실행합니다.

그럼 아래와 같은 UI가 표시되는데요. 여기서 입력 레이어에는 앞서 추가한 폴리라인을 지정합니다. 그리고 위치 비율이 있는데요. 이 값은 0~1 사이의 값을 갖습니다. 0이면 폴리라인의 시작점을 결과 포인트로 얻고 1이면 폴리라인의 끝점을 결과 포인트로 얻습니다. 0.5는 중간점을 결과 포인트로 얻습니다. 이런 위치비율의 값을 레이어의 속성 데이터의 필드로 갖는다면 해당 필드를 위의 “비율 필드”에 지정하면 됩니다.

위의 예시 화면처럼 값을 지정하고 “생성” 버튼을 클릭하면 결과 데이터가 생성되어 아카이브에 업로드하고 내 컴퓨터로 다운로드 받거나 다음처럼 레이어로 추가해 그 결과를 바로 살펴볼 수 있습니다.